LCOV - code coverage report
Current view: top level - core/auth - qgsauthconfig.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 27 0.0 %
Date: 2021-04-10 08:29:14 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :     qgsauthconfig.h
       3                 :            :     ---------------------
       4                 :            :     begin                : October 5, 2014
       5                 :            :     copyright            : (C) 2014 by Boundless Spatial, Inc. USA
       6                 :            :     author               : Larry Shaffer
       7                 :            :     email                : lshaffer at boundlessgeo dot com
       8                 :            :  ***************************************************************************
       9                 :            :  *                                                                         *
      10                 :            :  *   This program is free software; you can redistribute it and/or modify  *
      11                 :            :  *   it under the terms of the GNU General Public License as published by  *
      12                 :            :  *   the Free Software Foundation; either version 2 of the License, or     *
      13                 :            :  *   (at your option) any later version.                                   *
      14                 :            :  *                                                                         *
      15                 :            :  ***************************************************************************/
      16                 :            : 
      17                 :            : #ifndef QGSAUTHCONFIG_H
      18                 :            : #define QGSAUTHCONFIG_H
      19                 :            : 
      20                 :            : #include "qgis_core.h"
      21                 :            : #include <QHash>
      22                 :            : #include <QString>
      23                 :            : 
      24                 :            : #ifndef QT_NO_SSL
      25                 :            : #include <QSslCertificate>
      26                 :            : #include <QSslKey>
      27                 :            : #include <QSslError>
      28                 :            : #include <QSslSocket>
      29                 :            : #endif
      30                 :            : 
      31                 :            : #include "qgis.h"
      32                 :            : 
      33                 :            : 
      34                 :            : /**
      35                 :            :  * \ingroup core
      36                 :            :  * \brief Configuration storage class for authentication method configurations
      37                 :            :  */
      38                 :          0 : class CORE_EXPORT QgsAuthMethodConfig
      39                 :            : {
      40                 :            :   public:
      41                 :            : 
      42                 :            :     /**
      43                 :            :      * Construct a configuration for an authentication method
      44                 :            :      * \param method Textual key of the authentication method
      45                 :            :      * \param version Version of the configuration (for updating previously saved configs later on)
      46                 :            :      */
      47                 :            :     QgsAuthMethodConfig( const QString &method = QString(), int version = 0 );
      48                 :            : 
      49                 :            :     //! Operator used to compare configs' equality
      50                 :            :     bool operator==( const QgsAuthMethodConfig &other ) const;
      51                 :            : 
      52                 :            :     //! Operator used to compare configs' inequality
      53                 :            :     bool operator!=( const QgsAuthMethodConfig &other ) const;
      54                 :            : 
      55                 :            :     /**
      56                 :            :      * Gets 'authcfg' 7-character alphanumeric ID of the config
      57                 :            :      * \note This is set by QgsAuthManager when the config is initially stored
      58                 :            :      */
      59                 :          0 :     const QString id() const { return mId; }
      60                 :            :     //! Sets auth config ID
      61                 :          0 :     void setId( const QString &id ) { mId = id; }
      62                 :            : 
      63                 :            :     //! Gets name of configuration
      64                 :          0 :     const QString name() const { return mName; }
      65                 :            :     //! Sets name of configuration
      66                 :          0 :     void setName( const QString &name ) { mName = name; }
      67                 :            : 
      68                 :            :     //! A URI to auto-select a config when connecting to a resource
      69                 :          0 :     const QString uri() const { return mUri; }
      70                 :          0 :     void setUri( const QString &uri ) { mUri = uri; }
      71                 :            : 
      72                 :            :     //! Textual key of the associated authentication method
      73                 :          0 :     QString method() const { return mMethod; }
      74                 :          0 :     void setMethod( const QString &method ) { mMethod = method; }
      75                 :            : 
      76                 :            :     //! Gets version of the configuration
      77                 :          0 :     int version() const { return mVersion; }
      78                 :            :     //! Sets version of the configuration
      79                 :          0 :     void setVersion( int version ) { mVersion = version; }
      80                 :            : 
      81                 :            :     /**
      82                 :            :      * Whether the configuration is valid
      83                 :            :      * \param validateid Additionally verify the auth config ID is not empty
      84                 :            :      */
      85                 :            :     bool isValid( bool validateid = false ) const;
      86                 :            : 
      87                 :            :     /**
      88                 :            :      * The extended configuration, as stored and retrieved from the authentication database
      89                 :            :      * \note This is an internal construct used by QgsAuthManager that should generally not be set by client code
      90                 :            :      */
      91                 :            :     const QString configString() const;
      92                 :            : 
      93                 :            :     /**
      94                 :            :      * Load existing extended configuration
      95                 :            :      * \param configstr Configuration string to load
      96                 :            :      */
      97                 :            :     void loadConfigString( const QString &configstr );
      98                 :            : 
      99                 :            :     //! Gets extended configuration, mapped to key/value pairs of QStrings
     100                 :          0 :     QgsStringMap configMap() const { return mConfigMap; }
     101                 :            : 
     102                 :            :     /**
     103                 :            :      * Set extended configuration map
     104                 :            :      * \param map Map to set
     105                 :            :      */
     106                 :            :     void setConfigMap( const QgsStringMap &map ) { mConfigMap = map; }
     107                 :            : 
     108                 :            :     /**
     109                 :            :      * Set a single config value per key in the map
     110                 :            :      * \note if key exists, it is replaced
     111                 :            :      * \param key Config key
     112                 :            :      * \param value Config value
     113                 :            :      */
     114                 :            :     void setConfig( const QString &key, const QString &value );
     115                 :            : 
     116                 :            :     /**
     117                 :            :      * Set a multiple config values per key in the map
     118                 :            :      * \note if key exists, it is replaced
     119                 :            :      * \param key Config key
     120                 :            :      * \param value Config value
     121                 :            :      */
     122                 :            :     void setConfigList( const QString &key, const QStringList &value );
     123                 :            : 
     124                 :            :     /**
     125                 :            :      * Remove a config from map
     126                 :            :      * \param key Config to remove
     127                 :            :      * \returns Number of keys removed (should always be 1 or 0)
     128                 :            :      */
     129                 :            :     int removeConfig( const QString &key );
     130                 :            : 
     131                 :            :     /**
     132                 :            :      * Returns a config's value
     133                 :            :      * \param key Config key
     134                 :            :      * \param defaultvalue Default value, if key not found
     135                 :            :      */
     136                 :            :     QString config( const QString &key, const QString &defaultvalue = QString() ) const;
     137                 :            : 
     138                 :            :     /**
     139                 :            :      * Returns a config's list of values
     140                 :            :      * \param key
     141                 :            :      */
     142                 :            :     QStringList configList( const QString &key ) const;
     143                 :            : 
     144                 :            :     /**
     145                 :            :      * Whether a config key exists in config map
     146                 :            :      * \param key
     147                 :            :      */
     148                 :            :     bool hasConfig( const QString &key ) const;
     149                 :            : 
     150                 :            :     //! Clear all configs
     151                 :          0 :     void clearConfigMap() { mConfigMap.clear(); }
     152                 :            : 
     153                 :            :     /**
     154                 :            :      * A utility function for generating a resource from a URL to be compared
     155                 :            :      * against the config's uri() for auto-selecting authentication configs to use
     156                 :            :      * \note Essentially strips the URL query variables, and by default, strips the path as well
     157                 :            :      * \param accessurl A URL to process
     158                 :            :      * \param resource Output variable for result
     159                 :            :      * \param withpath Whether to include the URI's path in output
     160                 :            :      */
     161                 :            :     static bool uriToResource( const QString &accessurl, QString *resource, bool withpath = false );
     162                 :            : 
     163                 :            :   private:
     164                 :            :     QString mId;
     165                 :            :     QString mName;
     166                 :            :     QString mUri;
     167                 :            :     QString mMethod;
     168                 :            :     int mVersion;
     169                 :            : 
     170                 :            :     QgsStringMap mConfigMap;
     171                 :            : 
     172                 :            :     static const QString CONFIG_SEP;
     173                 :            :     static const QString CONFIG_KEY_SEP;
     174                 :            :     static const QString CONFIG_LIST_SEP;
     175                 :            : 
     176                 :            :     static const int CONFIG_VERSION;
     177                 :            : };
     178                 :            : 
     179                 :            : typedef QHash<QString, QgsAuthMethodConfig> QgsAuthMethodConfigsMap;
     180                 :            : 
     181                 :            : 
     182                 :            : #ifndef QT_NO_SSL
     183                 :            : 
     184                 :            : /**
     185                 :            :  * \ingroup core
     186                 :            :  * \brief Storage set for PKI bundle: SSL certificate, key, optional CA cert chain
     187                 :            :  * \note Useful for caching the bundle during application run sessions
     188                 :            :  */
     189                 :          0 : class CORE_EXPORT QgsPkiBundle
     190                 :            : {
     191                 :            :   public:
     192                 :            : 
     193                 :            :     /**
     194                 :            :      * Construct a bundle from existing PKI components
     195                 :            :      * \param clientCert Certificate to store in bundle
     196                 :            :      * \param clientKey Private key to store in bundle
     197                 :            :      * \param caChain Chain of Certificate Authorities for client certificate
     198                 :            :      */
     199                 :            :     QgsPkiBundle( const QSslCertificate &clientCert = QSslCertificate(),
     200                 :            :                   const QSslKey &clientKey = QSslKey(),
     201                 :            :                   const QList<QSslCertificate> &caChain = QList<QSslCertificate>() );
     202                 :            : 
     203                 :            :     /**
     204                 :            :      * Construct a bundle of PKI components from PEM-formatted file paths
     205                 :            :      * \param certPath Certificate file path
     206                 :            :      * \param keyPath Private key path
     207                 :            :      * \param keyPass Private key passphrase
     208                 :            :      * \param caChain Chain of Certificate Authorities for client certificate
     209                 :            :      */
     210                 :            :     static const QgsPkiBundle fromPemPaths( const QString &certPath,
     211                 :            :                                             const QString &keyPath,
     212                 :            :                                             const QString &keyPass = QString(),
     213                 :            :                                             const QList<QSslCertificate> &caChain = QList<QSslCertificate>() );
     214                 :            : 
     215                 :            :     /**
     216                 :            :      * Construct a bundle of PKI components from a PKCS#12 file path
     217                 :            :      * \param bundlepath Bundle file path
     218                 :            :      * \param bundlepass Optional bundle passphrase
     219                 :            :      */
     220                 :            :     static const QgsPkiBundle fromPkcs12Paths( const QString &bundlepath,
     221                 :            :         const QString &bundlepass = QString() );
     222                 :            : 
     223                 :            :     //! Whether the bundle, either its certificate or private key, is null
     224                 :            :     bool isNull() const;
     225                 :            : 
     226                 :            :     //! Whether the bundle is valid
     227                 :            :     bool isValid() const;
     228                 :            : 
     229                 :            :     //! The sha hash of the client certificate
     230                 :            :     const QString certId() const;
     231                 :            : 
     232                 :            :     //! Client certificate object
     233                 :          0 :     const QSslCertificate clientCert() const { return mCert; }
     234                 :            :     //! Sets client certificate object
     235                 :            :     void setClientCert( const QSslCertificate &cert );
     236                 :            : 
     237                 :            :     //! Private key object
     238                 :          0 :     const QSslKey clientKey() const { return mCertKey; }
     239                 :            :     //! Sets private key object
     240                 :            :     void setClientKey( const QSslKey &certkey );
     241                 :            : 
     242                 :            :     //! Chain of Certificate Authorities for client certificate
     243                 :          0 :     const QList<QSslCertificate> caChain() const { return mCaChain; }
     244                 :            :     //! Sets chain of Certificate Authorities for client certificate
     245                 :          0 :     void setCaChain( const QList<QSslCertificate> &cachain ) { mCaChain = cachain; }
     246                 :            : 
     247                 :            :   private:
     248                 :            :     QSslCertificate mCert;
     249                 :            :     QSslKey mCertKey;
     250                 :            :     QList<QSslCertificate> mCaChain;
     251                 :            : };
     252                 :            : 
     253                 :            : 
     254                 :            : /**
     255                 :            :  * \ingroup core
     256                 :            :  * \brief Storage set for constructed SSL certificate, key, associated with an authentication config
     257                 :            :  */
     258                 :            : class CORE_EXPORT QgsPkiConfigBundle
     259                 :            : {
     260                 :            :   public:
     261                 :            : 
     262                 :            :     /**
     263                 :            :      * Construct a bundle from existing PKI components and authentication method configuration
     264                 :            :      * \param config Authentication method configuration
     265                 :            :      * \param cert Certificate to store in bundle
     266                 :            :      * \param certkey Private key to store in bundle
     267                 :            :      * \param cachain list of CA certificates
     268                 :            :      */
     269                 :            :     QgsPkiConfigBundle( const QgsAuthMethodConfig &config,
     270                 :            :                         const QSslCertificate &cert,
     271                 :            :                         const QSslKey &certkey,
     272                 :            :                         const QList<QSslCertificate> &cachain = QList<QSslCertificate>( ) );
     273                 :            : 
     274                 :            :     //! Whether the bundle is valid
     275                 :            :     bool isValid();
     276                 :            : 
     277                 :            :     //! Authentication method configuration
     278                 :            :     const QgsAuthMethodConfig config() const { return mConfig; }
     279                 :            : 
     280                 :            :     //! Sets authentication method configuration
     281                 :            :     void setConfig( const QgsAuthMethodConfig &config ) { mConfig = config; }
     282                 :            : 
     283                 :            :     //! Client certificate object
     284                 :            :     const QSslCertificate clientCert() const { return mCert; }
     285                 :            : 
     286                 :            :     //! Sets client certificate object
     287                 :            :     void setClientCert( const QSslCertificate &cert ) { mCert = cert; }
     288                 :            : 
     289                 :            :     //! Private key object
     290                 :            :     const QSslKey clientCertKey() const { return mCertKey; }
     291                 :            : 
     292                 :            :     //! Sets private key object
     293                 :            :     void setClientCertKey( const QSslKey &certkey ) { mCertKey = certkey; }
     294                 :            : 
     295                 :            :     /**
     296                 :            :      * \brief caChain return the CA chain
     297                 :            :      * \return list of CA certificates
     298                 :            :      */
     299                 :            :     QList<QSslCertificate> caChain() const { return mCaChain; }
     300                 :            : 
     301                 :            :     /**
     302                 :            :      * \brief setCaChain set the CA chain
     303                 :            :      * \param caChain
     304                 :            :      */
     305                 :            :     void setCaChain( const QList<QSslCertificate> &caChain ) { mCaChain = caChain; }
     306                 :            : 
     307                 :            :   private:
     308                 :            :     QgsAuthMethodConfig mConfig;
     309                 :            :     QSslCertificate mCert;
     310                 :            :     QSslKey mCertKey;
     311                 :            :     QList<QSslCertificate> mCaChain;
     312                 :            : };
     313                 :            : 
     314                 :            : 
     315                 :            : 
     316                 :            : #ifdef SIP_RUN
     317                 :            : % MappedType QList<QSslError::SslError>
     318                 :            : {
     319                 :            :   % TypeHeaderCode
     320                 :            : #include <QList>
     321                 :            :   % End
     322                 :            : 
     323                 :            :   % ConvertFromTypeCode
     324                 :            :   // Create the list.
     325                 :            :   PyObject *l;
     326                 :            : 
     327                 :            :   if ( ( l = PyList_New( sipCpp->size() ) ) == NULL )
     328                 :            :     return NULL;
     329                 :            : 
     330                 :            :   // Set the list elements.
     331                 :            :   QList<QSslError::SslError>::iterator it = sipCpp->begin();
     332                 :            :   for ( int i = 0; it != sipCpp->end(); ++it, ++i )
     333                 :            :   {
     334                 :            :     PyObject *tobj;
     335                 :            : 
     336                 :            :     if ( ( tobj = sipConvertFromEnum( *it, sipType_QSslError_SslError ) ) == NULL )
     337                 :            :     {
     338                 :            :       Py_DECREF( l );
     339                 :            :       return NULL;
     340                 :            :     }
     341                 :            :     PyList_SET_ITEM( l, i, tobj );
     342                 :            :   }
     343                 :            : 
     344                 :            :   return l;
     345                 :            :   % End
     346                 :            : 
     347                 :            :   % ConvertToTypeCode
     348                 :            :   // Check the type if that is all that is required.
     349                 :            :   if ( sipIsErr == NULL )
     350                 :            :     return PyList_Check( sipPy );
     351                 :            : 
     352                 :            :   QList<QSslError::SslError> *qlist = new QList<QSslError::SslError>;
     353                 :            : 
     354                 :            :   for ( int i = 0; i < PyList_GET_SIZE( sipPy ); ++i )
     355                 :            :   {
     356                 :            :     *qlist << ( QSslError::SslError )SIPLong_AsLong( PyList_GET_ITEM( sipPy, i ) );
     357                 :            :   }
     358                 :            : 
     359                 :            :   *sipCppPtr = qlist;
     360                 :            :   return sipGetState( sipTransferObj );
     361                 :            :   % End
     362                 :            : };
     363                 :            : #endif
     364                 :            : 
     365                 :            : 
     366                 :            : 
     367                 :            : /**
     368                 :            :  * \ingroup core
     369                 :            :  * \brief Configuration container for SSL server connection exceptions or overrides
     370                 :            :  */
     371                 :          0 : class CORE_EXPORT QgsAuthConfigSslServer
     372                 :            : {
     373                 :            :   public:
     374                 :            :     //! Construct a default SSL server configuration
     375                 :            :     QgsAuthConfigSslServer();
     376                 :            : 
     377                 :            :     //! Server certificate object
     378                 :          0 :     const QSslCertificate sslCertificate() const { return mSslCert; }
     379                 :            :     //! Sets server certificate object
     380                 :          0 :     void setSslCertificate( const QSslCertificate &cert ) { mSslCert = cert; }
     381                 :            : 
     382                 :            :     //! Server host:port string
     383                 :          0 :     const QString sslHostPort() const  { return mSslHostPort; }
     384                 :            :     //! Sets server host:port string
     385                 :          0 :     void setSslHostPort( const QString &hostport ) { mSslHostPort = hostport; }
     386                 :            : 
     387                 :            :     //! SSL server protocol to use in connections
     388                 :          0 :     QSsl::SslProtocol sslProtocol() const { return mSslProtocol; }
     389                 :            :     //! Sets SSL server protocol to use in connections
     390                 :            :     void setSslProtocol( QSsl::SslProtocol protocol ) { mSslProtocol = protocol; }
     391                 :            : 
     392                 :            :     //! SSL server errors to ignore in connections
     393                 :            :     const QList<QSslError> sslIgnoredErrors() const;
     394                 :            :     //! SSL server errors (as enum list) to ignore in connections
     395                 :          0 :     const QList<QSslError::SslError> sslIgnoredErrorEnums() const { return mSslIgnoredErrors; }
     396                 :            :     //! Sets SSL server errors (as enum list) to ignore in connections
     397                 :            :     void setSslIgnoredErrorEnums( const QList<QSslError::SslError> &errors ) { mSslIgnoredErrors = errors; }
     398                 :            : 
     399                 :            :     //! SSL client's peer verify mode to use in connections
     400                 :          0 :     QSslSocket::PeerVerifyMode sslPeerVerifyMode() const { return mSslPeerVerifyMode; }
     401                 :            :     //! Sets SSL client's peer verify mode to use in connections
     402                 :            :     void setSslPeerVerifyMode( QSslSocket::PeerVerifyMode mode ) { mSslPeerVerifyMode = mode; }
     403                 :            : 
     404                 :            :     /**
     405                 :            :      * Number or SSL client's peer to verify in connections
     406                 :            :      * \note When set to 0 = unlimited depth
     407                 :            :      */
     408                 :          0 :     int sslPeerVerifyDepth() const { return mSslPeerVerifyDepth; }
     409                 :            : 
     410                 :            :     /**
     411                 :            :      * Set number or SSL client's peer to verify in connections
     412                 :            :      * \note When set to 0 = unlimited depth
     413                 :            :      */
     414                 :            :     void setSslPeerVerifyDepth( int depth ) { mSslPeerVerifyDepth = depth; }
     415                 :            : 
     416                 :            :     //! Version of the configuration (used for future upgrading)
     417                 :            :     int version() const { return mVersion; }
     418                 :            :     //! Sets version of the configuration (used for future upgrading)
     419                 :            :     void setVersion( int version ) { mVersion = version; }
     420                 :            : 
     421                 :            :     //! Qt version when the configuration was made (SSL protocols may differ)
     422                 :            :     int qtVersion() const { return mQtVersion; }
     423                 :            :     //! Sets Qt version when the configuration was made (SSL protocols may differ)
     424                 :            :     void setQtVersion( int version ) { mQtVersion = version; }
     425                 :            : 
     426                 :            :     //! Configuration as a concatenated string
     427                 :            :     const QString configString() const;
     428                 :            :     //! Load concatenated string into configuration, e.g. from auth database
     429                 :            :     void loadConfigString( const QString &config = QString() );
     430                 :            : 
     431                 :            :     //! Whether configuration is null (missing components)
     432                 :            :     bool isNull() const;
     433                 :            : 
     434                 :            :   private:
     435                 :            : 
     436                 :            :     QString mSslHostPort;
     437                 :            :     QSslCertificate mSslCert;
     438                 :            : 
     439                 :            :     QSsl::SslProtocol mSslProtocol;
     440                 :            :     int mQtVersion;
     441                 :            :     QList<QSslError::SslError> mSslIgnoredErrors;
     442                 :            :     QSslSocket::PeerVerifyMode mSslPeerVerifyMode = QSslSocket::VerifyPeer;
     443                 :            :     int mSslPeerVerifyDepth = 0;
     444                 :            :     int mVersion = 1;
     445                 :            : 
     446                 :            :     static const QString CONF_SEP;
     447                 :            : };
     448                 :            : #endif
     449                 :            : 
     450                 :            : #endif // QGSAUTHCONFIG_H

Generated by: LCOV version 1.14