QGIS API Documentation 3.99.0-Master (d270888f95f)
Loading...
Searching...
No Matches
qgsaccesscontrol.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsaccesscontrol.cpp
3 --------------------
4 begin : 22-05-2015
5 copyright : (C) 2008 by Stéphane Brunner
6 email : stephane dot brunner at camptocamp dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
18#include "qgsaccesscontrol.h"
19
20#include "qgsfeaturerequest.h"
21#include "qgsmaplayer.h"
22#include "qgsvectorlayer.h"
23
24#include <QString>
25
26using namespace Qt::StringLiterals;
27
28void QgsAccessControl::resolveFilterFeatures( const QList<QgsMapLayer *> &layers )
29{
30 for ( QgsMapLayer *l : layers )
31 {
32 if ( l->type() == Qgis::LayerType::Vector )
33 {
34 const QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( l );
35 mFilterFeaturesExpressions[vl->id()] = resolveFilterFeatures( vl );
36 }
37 }
38
39 mResolved = true;
40}
41
43{
44 QStringList expressions = QStringList();
45 QgsAccessControlFilterMap::const_iterator acIterator;
46
47 for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
48 {
49 const QString expression = acIterator.value()->layerFilterExpression( layer );
50 if ( !expression.isEmpty() )
51 {
52 expressions.append( expression );
53 }
54 }
55
56 QString expression;
57 if ( !expressions.isEmpty() )
58 {
59 expression = u"(("_s.append( expressions.join( ") AND ("_L1 ) ).append( "))" );
60 }
61
62 return expression;
63}
64
67{
68 mFilterFeaturesExpressions.clear();
69 mResolved = false;
70}
71
73void QgsAccessControl::filterFeatures( const QgsVectorLayer *layer, QgsFeatureRequest &featureRequest ) const
74{
75 QString expression;
76
77 if ( mResolved && mFilterFeaturesExpressions.contains( layer->id() ) )
78 {
79 expression = mFilterFeaturesExpressions[layer->id()];
80 }
81 else
82 {
83 expression = resolveFilterFeatures( layer );
84 }
85
86 if ( !expression.isEmpty() )
87 {
88 featureRequest.combineFilterExpression( expression );
89 }
90}
91
94{
95 return new QgsAccessControl( *this );
96}
97
100{
101 QStringList sqls;
102 QgsAccessControlFilterMap::const_iterator acIterator;
103 for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
104 {
105 const QString sql = acIterator.value()->layerFilterSubsetString( layer );
106 if ( !sql.isEmpty() )
107 {
108 sqls.append( sql );
109 }
110 }
111 return sqls.isEmpty() ? QString() : u"(("_s.append( sqls.join( ") AND ("_L1 ) ).append( "))" );
112}
113
116{
117 QgsAccessControlFilterMap::const_iterator acIterator;
118 for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
119 {
120 if ( !acIterator.value()->layerPermissions( layer ).canRead )
121 {
122 return false;
123 }
124 }
125 return true;
126}
127
130{
131 QgsAccessControlFilterMap::const_iterator acIterator;
132 for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
133 {
134 if ( !acIterator.value()->layerPermissions( layer ).canInsert )
135 {
136 return false;
137 }
138 }
139 return true;
140}
141
144{
145 QgsAccessControlFilterMap::const_iterator acIterator;
146 for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
147 {
148 if ( !acIterator.value()->layerPermissions( layer ).canUpdate )
149 {
150 return false;
151 }
152 }
153 return true;
154}
155
158{
159 QgsAccessControlFilterMap::const_iterator acIterator;
160 for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
161 {
162 if ( !acIterator.value()->layerPermissions( layer ).canDelete )
163 {
164 return false;
165 }
166 }
167 return true;
168}
169
171QStringList QgsAccessControl::layerAttributes( const QgsVectorLayer *layer, const QStringList &attributes ) const
172{
173 QStringList currentAttributes( attributes );
174 QgsAccessControlFilterMap::const_iterator acIterator;
175 for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
176 {
177 currentAttributes = acIterator.value()->authorizedLayerAttributes( layer, currentAttributes );
178 }
179 return currentAttributes;
180}
181
183bool QgsAccessControl::allowToEdit( const QgsVectorLayer *layer, const QgsFeature &feature ) const
184{
185 QgsAccessControlFilterMap::const_iterator acIterator;
186 for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
187 {
188 if ( !acIterator.value()->allowToEdit( layer, feature ) )
189 {
190 return false;
191 }
192 }
193 return true;
194}
195
197bool QgsAccessControl::fillCacheKey( QStringList &cacheKey ) const
198{
199 QgsAccessControlFilterMap::const_iterator acIterator;
200 for ( acIterator = mPluginsAccessControls->constBegin(); acIterator != mPluginsAccessControls->constEnd(); ++acIterator )
201 {
202 const QString newKey = acIterator.value()->cacheKey();
203 if ( !newKey.isEmpty() )
204 {
205 cacheKey.clear();
206 return false;
207 }
208 }
209 return true;
210}
211
214{
215 mPluginsAccessControls->insert( priority, accessControl );
216}
@ Vector
Vector layer.
Definition qgis.h:194
Defines access control interface for QGIS Server plugins.
QStringList layerAttributes(const QgsVectorLayer *layer, const QStringList &attributes) const override
Returns the authorized layer attributes.
bool layerUpdatePermission(const QgsVectorLayer *layer) const
Returns the layer update right.
void filterFeatures(const QgsVectorLayer *layer, QgsFeatureRequest &filterFeatures) const override
Filter the features of the layer.
bool layerInsertPermission(const QgsVectorLayer *layer) const
Returns the layer insert right.
bool layerReadPermission(const QgsMapLayer *layer) const
Returns the layer read right.
QgsAccessControl * clone() const override
Clone the object.
bool fillCacheKey(QStringList &cacheKey) const
Fill the capabilities caching key.
bool allowToEdit(const QgsVectorLayer *layer, const QgsFeature &feature) const
Are we authorized to modify the following geometry.
bool layerDeletePermission(const QgsVectorLayer *layer) const
Returns the layer delete right.
void resolveFilterFeatures(const QList< QgsMapLayer * > &layers)
Resolve features' filter of layers The method fetch filter's expressions returned from access control...
void registerAccessControl(QgsAccessControlFilter *accessControl, int priority=0)
Register an access control filter.
void unresolveFilterFeatures()
Clear expression's cache computed from resolveFilterFeatures.
QgsAccessControl()
Constructor.
QString extraSubsetString(const QgsVectorLayer *layer) const
Returns an additional subset string (typically SQL) filter.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & combineFilterExpression(const QString &expression)
Modifies the existing filter expression to add an additional expression filter.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
Base class for all map layer types.
Definition qgsmaplayer.h:83
QString id
Definition qgsmaplayer.h:86
Represents a vector layer which manages a vector based dataset.
const QString cacheKey(const QString &pathIn)