Skip to content

Commit

Permalink
Use a layerId instance of a layer in the access control interface
Browse files Browse the repository at this point in the history
  • Loading branch information
sbrunner committed Dec 23, 2015
1 parent e6a265c commit 6d56cba
Show file tree
Hide file tree
Showing 17 changed files with 122 additions and 108 deletions.
4 changes: 2 additions & 2 deletions python/core/qgsfeaturefilterprovider.sip
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ class QgsFeatureFilterProvider

/** Add additional filters to the feature request to further restrict the features returned by the request.
* Derived classes must implement this method.
* @param layer the layer to filter
* @param layerId the layer id to filter
* @param featureRequest the feature request to update
*/
virtual void filterFeatures( const QgsVectorLayer* layer, QgsFeatureRequest& featureRequest ) const = 0;
virtual void filterFeatures( const QString& layerId, QgsFeatureRequest& featureRequest ) const = 0;

/** Create a clone of the feature filter provider
* @return a new clone
Expand Down
11 changes: 5 additions & 6 deletions python/server/qgsaccesscontrolfilter.sip
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ class QgsAccessControlFilter
#include "qgsaccesscontrolfilter.h"
#include "qgsserverinterface.h"
#include "qgsfeature.h"
#include "qgsmaplayer.h"
%End

public:
Expand All @@ -60,16 +59,16 @@ class QgsAccessControlFilter
/** Return the QgsServerInterface instance*/
const QgsServerInterface* serverInterface() const;
/** Return an additional expression filter */
virtual const QString layerFilterExpression( const QgsVectorLayer* layer /Transfer/ ) const;
virtual const QString layerFilterExpression( const QString& layerId ) const;
/** Return an additional the subset string (typically SQL) filter.
Faster than the layerFilterExpression but not supported on all the type of layer */
virtual const QString layerFilterSubsetString( const QgsVectorLayer* layer /Transfer/ ) const;
virtual const QString layerFilterSubsetString( const QString& layerId ) const;
/** Return the layer permissions */
virtual const LayerPermissions layerPermissions( const QgsMapLayer* layer /Transfer/ ) const;
virtual const LayerPermissions layerPermissions( const QString& layerId ) const;
/** Return the authorized layer attributes */
virtual const QStringList* authorizedLayerAttributes( const QgsVectorLayer* layer /Transfer/, const QStringList& attributes ) const;
virtual const QStringList* authorizedLayerAttributes( const QString& layerId, const QStringList& attributes ) const;
/** Are we authorize to modify the following geometry */
virtual bool allowToEdit( const QgsVectorLayer* layer /Transfer/, const QgsFeature& feature /Transfer/ ) const;
virtual bool allowToEdit( const QString& layerId, const QgsFeature& feature /Transfer/ ) const;
/** Cache key to used to create the capabilities cache, "" for no cache, shouldn't any contains "-", default to "" */
virtual const QString cacheKey() const;
};
Expand Down
5 changes: 2 additions & 3 deletions src/core/qgsfeaturefilterprovider.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#include <QtGlobal>

class QString;
class QgsVectorLayer;
class QgsFeatureRequest;


Expand All @@ -45,10 +44,10 @@ class CORE_EXPORT QgsFeatureFilterProvider

/** Add additional filters to the feature request to further restrict the features returned by the request.
* Derived classes must implement this method.
* @param layer the layer to filter
* @param layerId the layer id to filter
* @param featureRequest the feature request to update
*/
virtual void filterFeatures( const QgsVectorLayer* layer, QgsFeatureRequest& featureRequest ) const = 0;
virtual void filterFeatures( const QString& layerId, QgsFeatureRequest& featureRequest ) const = 0;

/** Create a clone of the feature filter provider
* @return a new clone
Expand Down
2 changes: 1 addition & 1 deletion src/core/qgsvectorlayerrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ bool QgsVectorLayerRenderer::render()
const QgsFeatureFilterProvider* featureFilterProvider = mContext.featureFilterProvider();
if ( featureFilterProvider )
{
featureFilterProvider->filterFeatures( mLayer, featureRequest );
featureFilterProvider->filterFeatures( mLayer->id(), featureRequest );
}
if ( !rendererFilter.isEmpty() && rendererFilter != "TRUE" )
{
Expand Down
34 changes: 16 additions & 18 deletions src/server/qgsaccesscontrol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,18 @@

#include "qgsaccesscontrol.h"
#include "qgsfeaturerequest.h"
#include "qgsmaplayer.h"
#include "qgsvectorlayer.h"

#include <QStringList>


/** Filter the features of the layer */
void QgsAccessControl::filterFeatures( const QgsVectorLayer* layer, QgsFeatureRequest& featureRequest ) const
void QgsAccessControl::filterFeatures( const QString& layerId, QgsFeatureRequest& featureRequest ) const
{
QStringList expressions = QStringList();
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
const QString expression = acIterator.value()->layerFilterExpression( layer );
const QString expression = acIterator.value()->layerFilterExpression( layerId );
if ( !expression.isEmpty() )
{
expressions.append( expression );
Expand All @@ -49,13 +47,13 @@ QgsFeatureFilterProvider* QgsAccessControl::clone() const
}

/** Return an additional subset string (typically SQL) filter */
const QString QgsAccessControl::extraSubsetString( const QgsVectorLayer* layer ) const
const QString QgsAccessControl::extraSubsetString( const QString& layerId ) const
{
QStringList sqls = QStringList();
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
const QString sql = acIterator.value()->layerFilterSubsetString( layer );
const QString sql = acIterator.value()->layerFilterSubsetString( layerId );
if ( !sql.isEmpty() )
{
sqls.append( sql );
Expand All @@ -65,12 +63,12 @@ const QString QgsAccessControl::extraSubsetString( const QgsVectorLayer* layer )
}

/** Return the layer read right */
bool QgsAccessControl::layerReadPermission( const QgsMapLayer* layer ) const
bool QgsAccessControl::layerReadPermission( const QString& layerId ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->layerPermissions( layer ).canRead )
if ( !acIterator.value()->layerPermissions( layerId ).canRead )
{
return false;
}
Expand All @@ -79,12 +77,12 @@ bool QgsAccessControl::layerReadPermission( const QgsMapLayer* layer ) const
}

/** Return the layer insert right */
bool QgsAccessControl::layerInsertPermission( const QgsVectorLayer* layer ) const
bool QgsAccessControl::layerInsertPermission( const QString& layerId ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->layerPermissions( layer ).canInsert )
if ( !acIterator.value()->layerPermissions( layerId ).canInsert )
{
return false;
}
Expand All @@ -93,12 +91,12 @@ bool QgsAccessControl::layerInsertPermission( const QgsVectorLayer* layer ) cons
}

/** Return the layer update right */
bool QgsAccessControl::layerUpdatePermission( const QgsVectorLayer* layer ) const
bool QgsAccessControl::layerUpdatePermission( const QString& layerId ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->layerPermissions( layer ).canUpdate )
if ( !acIterator.value()->layerPermissions( layerId ).canUpdate )
{
return false;
}
Expand All @@ -107,12 +105,12 @@ bool QgsAccessControl::layerUpdatePermission( const QgsVectorLayer* layer ) cons
}

/** Return the layer delete right */
bool QgsAccessControl::layerDeletePermission( const QgsVectorLayer* layer ) const
bool QgsAccessControl::layerDeletePermission( const QString& layerId ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->layerPermissions( layer ).canDelete )
if ( !acIterator.value()->layerPermissions( layerId ).canDelete )
{
return false;
}
Expand All @@ -121,13 +119,13 @@ bool QgsAccessControl::layerDeletePermission( const QgsVectorLayer* layer ) cons
}

/** Return the authorized layer attributes */
const QStringList QgsAccessControl::layerAttributes( const QgsVectorLayer* layer, const QStringList attributes ) const
const QStringList QgsAccessControl::layerAttributes( const QString& layerId, const QStringList attributes ) const
{
QStringList currentAttributes( attributes );
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
const QStringList* newAttributes = acIterator.value()->authorizedLayerAttributes( layer, currentAttributes );
const QStringList* newAttributes = acIterator.value()->authorizedLayerAttributes( layerId, currentAttributes );
if ( newAttributes )
{
currentAttributes = *newAttributes;
Expand All @@ -137,12 +135,12 @@ const QStringList QgsAccessControl::layerAttributes( const QgsVectorLayer* layer
}

/** Are we authorized to modify the following geometry */
bool QgsAccessControl::allowToEdit( const QgsVectorLayer* layer, const QgsFeature& feature ) const
bool QgsAccessControl::allowToEdit( const QString& layerId, const QgsFeature& feature ) const
{
QgsAccessControlFilterMap::const_iterator acIterator;
for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
{
if ( !acIterator.value()->allowToEdit( layer, feature ) )
if ( !acIterator.value()->allowToEdit( layerId, feature ) )
{
return false;
}
Expand Down
32 changes: 16 additions & 16 deletions src/server/qgsaccesscontrol.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,59 +53,59 @@ class SERVER_EXPORT QgsAccessControl : public QgsFeatureFilterProvider
}

/** Filter the features of the layer
* @param layer the layer to control
* @param layerId the layer id to control
* @param filterFeatures the request to fill
*/
void filterFeatures( const QgsVectorLayer* layer, QgsFeatureRequest& filterFeatures ) const;
void filterFeatures( const QString& layerId, QgsFeatureRequest& filterFeatures ) const;

/** Return a clone of the object
* @return A clone
*/
QgsFeatureFilterProvider* clone() const;

/** Return an additional subset string (typically SQL) filter
* @param layer the layer to control
* @param layerId the layer id to control
* @return the subset string to use
*/
const QString extraSubsetString( const QgsVectorLayer* layer ) const;
const QString extraSubsetString( const QString& layerId ) const;

/** Return the layer read right
* @param layer the layer to control
* @param layerId the layer id to control
* @return true if it can be read
*/
bool layerReadPermission( const QgsMapLayer* layer ) const;
bool layerReadPermission( const QString& layerId ) const;

/** Return the layer insert right
* @param layer the layer to control
* @param layerId the layer id to control
* @return true if we can insert on it
*/
bool layerInsertPermission( const QgsVectorLayer* layer ) const;
bool layerInsertPermission( const QString& layerId ) const;

/** Return the layer update right
* @param layer the layer to control
* @param layerId the layer id to control
* @return true if we can do an update
*/
bool layerUpdatePermission( const QgsVectorLayer* layer ) const;
bool layerUpdatePermission( const QString& layerId ) const;

/** Return the layer delete right
* @param layer the layer to control
* @param layerId the layer id to control
* @return true if we can do a delete
*/
bool layerDeletePermission( const QgsVectorLayer* layer ) const;
bool layerDeletePermission( const QString& layerId ) const;

/** Return the authorized layer attributes
* @param layer the layer to control
* @param layerId the layer id to control
* @param attributes the list of attribute
* @return the list of visible attributes
*/
const QStringList layerAttributes( const QgsVectorLayer* layer, const QStringList attributes ) const;
const QStringList layerAttributes( const QString& layerId, const QStringList attributes ) const;

/** Are we authorized to modify the following geometry
* @param layer the layer to control
* @param layerId the layer id to control
* @param feature the concerned feature
* @return true if we are allowed to edit the feature
*/
bool allowToEdit( const QgsVectorLayer* layer, const QgsFeature& feature ) const;
bool allowToEdit( const QString& layerId, const QgsFeature& feature ) const;

/** Fill the capabilities caching key
* @param cacheKey the list to fill with a cache variant
Expand Down
20 changes: 10 additions & 10 deletions src/server/qgsaccesscontrolfilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,45 +38,45 @@ QgsAccessControlFilter::~QgsAccessControlFilter()
}

/** Return an additional layer expression filter */
const QString QgsAccessControlFilter::layerFilterExpression( const QgsVectorLayer* layer ) const
const QString QgsAccessControlFilter::layerFilterExpression( const QString& layerId ) const
{
QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default layerFilterExpression called", "AccessControlFilter", QgsMessageLog::INFO );
Q_UNUSED( layer );
Q_UNUSED( layerId );
return nullptr;
}

/** Return an additional layer subset string (typically SQL) filter */
const QString QgsAccessControlFilter::layerFilterSubsetString( const QgsVectorLayer* layer ) const
const QString QgsAccessControlFilter::layerFilterSubsetString( const QString& layerId ) const
{
QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default layerFilterSQL called", "AccessControlFilter", QgsMessageLog::INFO );
Q_UNUSED( layer );
Q_UNUSED( layerId );
return nullptr;
}

/** Return the layer permissions */
const QgsAccessControlFilter::LayerPermissions QgsAccessControlFilter::layerPermissions( const QgsMapLayer* layer ) const
const QgsAccessControlFilter::LayerPermissions QgsAccessControlFilter::layerPermissions( const QString& layerId ) const
{
QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default layerPermissions called", "AccessControlFilter", QgsMessageLog::INFO );
Q_UNUSED( layer );
Q_UNUSED( layerId );
LayerPermissions permissions = QgsAccessControlFilter::LayerPermissions();
permissions.canRead = permissions.canUpdate = permissions.canInsert = permissions.canDelete = true;
return permissions;
}

/** Return the authorized layer attributes */
const QStringList* QgsAccessControlFilter::authorizedLayerAttributes( const QgsVectorLayer* layer, const QStringList& attributes ) const
const QStringList* QgsAccessControlFilter::authorizedLayerAttributes( const QString& layerId, const QStringList& attributes ) const
{
Q_UNUSED( layer );
Q_UNUSED( layerId );
Q_UNUSED( attributes );
QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default authorizedLayerAttributes called", "AccessControlFilter", QgsMessageLog::INFO );
return nullptr;
}

/** Are we authorized to modify the feature */
bool QgsAccessControlFilter::allowToEdit( const QgsVectorLayer* layer, const QgsFeature& feature ) const
bool QgsAccessControlFilter::allowToEdit( const QString& layerId, const QgsFeature& feature ) const
{
QgsMessageLog::logMessage( "QgsAccessControlFilter plugin default allowToEdit called", "AccessControlFilter", QgsMessageLog::INFO );
Q_UNUSED( layer );
Q_UNUSED( layerId );
Q_UNUSED( feature );
return true;
}
Expand Down
22 changes: 10 additions & 12 deletions src/server/qgsaccesscontrolfilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@
#include <QString>

class QgsServerInterface;
class QgsMapLayer;
class QgsVectorLayer;
class QgsExpression;
class QgsFeature;

Expand Down Expand Up @@ -66,36 +64,36 @@ class SERVER_EXPORT QgsAccessControlFilter
const QgsServerInterface* serverInterface() const { return mServerInterface; }

/** Return an additional expression filter
* @param layer the layer to control
* @param layerId the layer id to control
* @return the filter expression
*/
virtual const QString layerFilterExpression( const QgsVectorLayer* layer ) const;
virtual const QString layerFilterExpression( const QString& layerId ) const;

/** Return an additional subset string (typically SQL) filter
* @param layer the layer to control
* @param layerId the layer id to control
* @return the subset string
*/
virtual const QString layerFilterSubsetString( const QgsVectorLayer* layer ) const;
virtual const QString layerFilterSubsetString( const QString& layerId ) const;

/** Return the layer permissions
* @param layer the layer to control
* @param layerId the layer id to control
* @return the permission to use on the layer
*/
virtual const LayerPermissions layerPermissions( const QgsMapLayer* layer ) const;
virtual const LayerPermissions layerPermissions( const QString& layerId ) const;

/** Return the authorized layer attributes
* @param layer the layer to control
* @param layerId the layer id to control
* @param attributes the current list of visible attribute
* @return the new list of visible attributes
*/
virtual const QStringList* authorizedLayerAttributes( const QgsVectorLayer* layer, const QStringList& attributes ) const;
virtual const QStringList* authorizedLayerAttributes( const QString& layerId, const QStringList& attributes ) const;

/** Are we authorized to modify the following geometry
* @param layer the layer to control
* @param layerId the layer id to control
* @param feature the concerned feature
* @return true if we are allowed to edit
*/
virtual bool allowToEdit( const QgsVectorLayer* layer, const QgsFeature& feature ) const;
virtual bool allowToEdit( const QString& layerId, const QgsFeature& feature ) const;

/** Cache key to used to create the capabilities cache
* @return the cache key, "" for no cache
Expand Down
2 changes: 1 addition & 1 deletion src/server/qgsowsserver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ void QgsOWSServer::applyAccessControlLayerFilters( QgsMapLayer* mapLayer, QMap<Q
{
if ( layer->setSubsetString( "" ) )
{
QString sql = mAccessControl->extraSubsetString( layer );
QString sql = mAccessControl->extraSubsetString( layer->id() );
if ( !sql.isEmpty() )
{
if ( !originalLayerFilters.contains( layer->id() ) )
Expand Down
Loading

0 comments on commit 6d56cba

Please sign in to comment.