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