QGIS/src/server/qgsaccesscontrol.cpp
Mathieu Pellerin d31b74c0ae Address review
2025-06-30 11:07:37 +12:00

213 lines
6.7 KiB
C++

/***************************************************************************
qgsaccesscontrol.cpp
--------------------
begin : 22-05-2015
copyright : (C) 2008 by Stéphane Brunner
email : stephane dot brunner at camptocamp dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgsaccesscontrol.h"
#include "qgsfeaturerequest.h"
#include "qgsmaplayer.h"
#include "qgsvectorlayer.h"
void QgsAccessControl::resolveFilterFeatures( const QList<QgsMapLayer *> &layers )
{
for ( QgsMapLayer *l : layers )
{
if ( l->type() == Qgis::LayerType::Vector )
{
const QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( l );
mFilterFeaturesExpressions[vl->id()] = resolveFilterFeatures( vl );
}
}
mResolved = true;
}
QString QgsAccessControl::resolveFilterFeatures( const QgsVectorLayer *layer ) const
{
QStringList expressions = QStringList();
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
const QString expression = acIterator.value()->layerFilterExpression( layer );
if ( !expression.isEmpty() )
{
expressions.append( expression );
}
}
QString expression;
if ( !expressions.isEmpty() )
{
expression = QStringLiteral( "((" ).append( expressions.join( QLatin1String( ") AND (" ) ) ).append( "))" );
}
return expression;
}
//! Clear feature's filter of layers
void QgsAccessControl::unresolveFilterFeatures()
{
mFilterFeaturesExpressions.clear();
mResolved = false;
}
//! Filter the features of the layer
void QgsAccessControl::filterFeatures( const QgsVectorLayer *layer, QgsFeatureRequest &featureRequest ) const
{
QString expression;
if ( mResolved && mFilterFeaturesExpressions.contains( layer->id() ) )
{
expression = mFilterFeaturesExpressions[layer->id()];
}
else
{
expression = resolveFilterFeatures( layer );
}
if ( !expression.isEmpty() )
{
featureRequest.combineFilterExpression( expression );
}
}
//! Clone the object
QgsAccessControl *QgsAccessControl::clone() const
{
return new QgsAccessControl( *this );
}
//! Returns an additional subset string (typically SQL) filter
QString QgsAccessControl::extraSubsetString( const QgsVectorLayer *layer ) const
{
QStringList sqls;
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
const QString sql = acIterator.value()->layerFilterSubsetString( layer );
if ( !sql.isEmpty() )
{
sqls.append( sql );
}
}
return sqls.isEmpty() ? QString() : QStringLiteral( "((" ).append( sqls.join( QLatin1String( ") AND (" ) ) ).append( "))" );
}
//! Returns the layer read right
bool QgsAccessControl::layerReadPermission( const QgsMapLayer *layer ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->layerPermissions( layer ).canRead )
{
return false;
}
}
return true;
}
//! Returns the layer insert right
bool QgsAccessControl::layerInsertPermission( const QgsVectorLayer *layer ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->layerPermissions( layer ).canInsert )
{
return false;
}
}
return true;
}
//! Returns the layer update right
bool QgsAccessControl::layerUpdatePermission( const QgsVectorLayer *layer ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->layerPermissions( layer ).canUpdate )
{
return false;
}
}
return true;
}
//! Returns the layer delete right
bool QgsAccessControl::layerDeletePermission( const QgsVectorLayer *layer ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->layerPermissions( layer ).canDelete )
{
return false;
}
}
return true;
}
//! Returns the authorized layer attributes
QStringList QgsAccessControl::layerAttributes( const QgsVectorLayer *layer, const QStringList &attributes ) const
{
QStringList currentAttributes( attributes );
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
currentAttributes = acIterator.value()->authorizedLayerAttributes( layer, currentAttributes );
}
return currentAttributes;
}
//! Are we authorized to modify the following geometry
bool QgsAccessControl::allowToEdit( const QgsVectorLayer *layer, const QgsFeature &feature ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->allowToEdit( layer, feature ) )
{
return false;
}
}
return true;
}
//! Fill the capabilities caching key
bool QgsAccessControl::fillCacheKey( QStringList &cacheKey ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
const QString newKey = acIterator.value()->cacheKey();
if ( !newKey.isEmpty() )
{
cacheKey.clear();
return false;
}
}
return true;
}
//! Register a new access control filter
void QgsAccessControl::registerAccessControl( QgsAccessControlFilter *accessControl, int priority )
{
mPluginsAccessControls->insert( priority, accessControl );
}