
    shL                         d Z dZdZddlmZmZmZmZ ddlm	Z	m
Z
 ddlmZmZmZmZmZmZmZ ddlmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZmZm Z m!Z!m"Z"  G d de	      Z#y)zCopyright 2021, 3LizzGPL version 3zinfo@3liz.org    )QgsExpressionQgsMapLayer
QgsProjectQgsVectorLayer)QgsAccessControlFilterQgsServerInterface)get_lizmap_configget_lizmap_groupsget_lizmap_layer_login_filterget_lizmap_layers_configget_lizmap_override_filterget_lizmap_user_loginis_editing_context)ALL_FEATURESNO_FEATURESFilterByPolygon
FilterType)Logger	profiling)to_bool)BING_DOMAINBING_KEYGOOGLE_DOMAIN
GOOGLE_KEYstrict_tos_checkc                        e Zd Zdeddf fdZdedef fdZdede	j                  f fdZdef fdZeded	edefd
       Zedededededef
d       Z xZS )LizmapAccessControlFilterserver_ifacereturnNc                     t         |   |       || _        t        t              | _        t        t              | _        t        j                  d| j
                   d| j                          y )NzLayerAccessControl : Google z, Bing )
super__init__ifacer   r   _strict_googler   _strict_bingr   info)selfr   	__class__s     B/var/www/qgis-server/plugins/lizmap_server/lizmap_accesscontrol.pyr"   z"LizmapAccessControlFilter.__init__$   sY    &!
.z:,X6243F3F2GwtO`O`Nabc    layerc                     t        j                  d       | j                  |t        j                        }|r|S t
        |   |      S )z; Return an additional subset string (typically SQL) filter zLizmap layerFilterSubsetStringfilter_type)r   r&   get_lizmap_layer_filterr   SafeSqlQueryr!   layerFilterSubsetString)r'   r+   
filter_expr(   s      r)   r1   z1LizmapAccessControlFilter.layerFilterSubsetString?   sF    45 11%ZE\E\1]
w.u55r*   c                    t         |   |      }|j                         }t        j                         }| j
                  j                         }|j                         sj|j                  d      j                         dk7  rHt        j                  d| d|j                          d       dx|_        x|_        x|_        |_        |S t#        |      }t%        |      }|j'                         }|j)                  dd      |k7  r$||d<   t+        |      |d	<   |j-                  |       |j                  d      j                         d
k(  }	|	rL|j                  d      j                         dk(  r*| j
                  j/                         j1                  |g       |j3                         j5                         }
t6        |
v }t8        |
v }|s|rt        j                  d| d       t;        | j
                  j=                               }|sV|r)| j>                   x|_        x|_        x|_        |_        |S |r'| j@                   x|_        x|_        x|_        |_        |S tC        |      dk(  r|s|s|S |d   j)                  dd      }|rY|sWtE        tF              rHdx|_        x|_        x|_        |_        t        jH                  d| d|jK                          d       |S |d   j)                  dd      }|rY|sWtE        tL              rHdx|_        x|_        x|_        |_        t        jH                  d| d|jK                          d       |S tO        |      }|s|S |jQ                         }|j)                  d      r,||d   v r|d   |   r|d   |   }d}|j)                  d      rQ|d   jS                  d      }|D cg c]  }|jU                          }}tC        |      dk7  r|D ]	  }||v sd} nd}nd}|red|v ra|d   r\|d   |   d   }tW        |d         |_        tW        |d         |_        tY        tW        |d         tW        |d         g      |_        nrdx|_        x|_        |_        n\t        j                  d | d!| d"       dx|_        x|_        |_        n*t        j                  d#       dx|_        x|_        |_        ||vs||   st        j                  d$|        |S ||   }d%|vs|d%   st        j                  d&|        |S |d%   D cg c]  }|jU                          }}|D ]%  }||v st        j                  d'| d(|        |c S  t        j                  d)d*j[                  |       d(|        d|_        dx|_        x|_        |_        |S c c}w c c}w )+z Return the layer rights serviceWMSzlayerPermission: Layer z is invalid in !Flizmap_userNlizmap_user_groupsWFSrequest
GETFEATUREzLayer 'zD' has been detected as an external layer which might need a API key.r   options	googleKey zThe layer 'zb' is protected by a licence, but the API key is not provided. Discarding the layer in the project .bingKeyeditionLayersacl,TcapabilitiescreateFeaturedeleteFeaturemodifyAttributemodifyGeometryz%No edition config defined for layer: z ()z"Lizmap config has no editionLayerszLizmap config has no layer: group_visibilityz&No Lizmap layer group visibility for: zGroup z* is in Lizmap layer group visibility for: zGroups z, ).r!   layerPermissionsnamer   instancer#   requestHandlerisValid	parameterupperr   r&   fileNamecanRead	canInsert	canUpdate	canDeleter
   r   customVariablesgetlistsetCustomVariablesaccessControlsresolveFilterFeaturessourcelowerr   r   r	   configFilePathr$   r%   lenr   r   warningbaseNamer   r   idsplitstripr   anyjoin)r'   r+   rights
layer_nameprojectrequest_handlergroups
user_login
custom_varis_wfs
datasource	is_googleis_bingcfgapi_key
cfg_layerslayer_id
edit_layercan_edit
group_editgedit_layer_cap	cfg_layerrJ   r(   s                           r)   rK   z*LizmapAccessControlFilter.layerPermissionsJ   s    )%0 ZZ\
 %%' **335 }}?#<#<Y#G#M#M#OSX#XKK1*_WM]M]M_L``abcV[[FN[V-[0@6CSM #?3 +?;
,,.
>>-.*<(2J}%/3F|J+,&&z2 !**95;;=Fo//	:@@BlRJJ%%'==ugF\\^))+
!Z/	+KK'*-qrs  

 9 9 ;<^b^q^qZqqq!1qF4DvGW M ^b^o^oZooo!1oF4DvGWM v;!Y'Mi.$$["5W)9*)EV[[FN[V-[0@6CSNNj\ *((/(8(8(:';1> Mi.$$Y37'7'AV[[FN[V-[0@6CSNNj\ *((/(8(8(:';1> M .c2
M 88:77?#3//C4H4R 1(;
 !>>%( ",E!2!8!8!=J5?!@!'')!@J!@ :!+!' 0A J+/0 $(  $H* <NA[ &)%9(%CN%SN'.~o/N'OF$'.~o/N'OF$'*/@ AB/? @A, (F$ NSRF$Rv'7&:J ;J<r(STUWINN N6#3f6F KK<=EJJFJv/&2B Z'z*/EKK6zlCDM z*	Y.i@R6SKK@MNM 099K/LM!AGGIMM
  	A$$QCI*VX		 	dii'((RS]R^_	aAFFF6+f.>[ "Ax Ns   V6+V;c                 4   t         
|          }t        | j                  j	                               }t        |      dk(  r|S t        | j                  j                               }|s|S t        |      }|s|S d}|j                         D ]I  \  }}d|vs|d   s|d   D cg c]  }|j                          }	}t        |	      dk(  r	|d   dk(  rGd} n |r:t        |      dk(  r	|d   dk(  rydj                  t        t        |                  S |S c c}w )z! The key used to cache documents r   FrJ      r>   Tz@@)r!   cacheKeyr
   r#   rN   r`   r	   r_   r   itemsre   rg   rY   set)r'   default_cache_keyrl   rs   ru   has_group_visibilityl_namer|   rz   rJ   r(   s             r)   r   z"LizmapAccessControlFilter.cacheKey   s7   !G,. #4::#<#<#>? v;!$$  

 9 9 ;<$$ .c2
$$  %!+!1!1!3 	FI!2)DV:W 4==O3PQa	QQ #$)fQi2o#' 	   6{aF1IO99T#f+.//  #  Rs   "Dr.   c                    t        | j                  j                               rt        S t	        | j                  j                               }t        | j                  j                               }t        |      dk(  r|st        S t        | j                  j                               }|st        S t        |      }|st        S |j                         }||vrt        S 	 t        | j                  j                               }t        |j                  d      |||      }	t        }
|	j                         rp|	j                         s.t!        j"                  dj%                  t&                     t&        S |}|	j)                         rt+        |g      }|	j-                  |      \  }
}|
rt!        j2                  d|
        t5        ||      }|s
|
r|
S t        S d|v }|rt7        |d         r
|
r|
S t        S |d	   }t        |      d
k(  r.|d   dk(  r&|dk(  r!t9        j:                  |d      }|
r|
 d| S |S | j=                  ||||j?                         j                               }|
r|
 d| S |S # t.        $ rM}t!        j0                  |       t!        j"                  dj%                  t&                     t&        cY d}~S d}~ww xY w)z/ Get lizmap layer filter based on login filter r   filter_by_polygonr-   zOThe filter by polygon configuration is not valid.
 All features are hidden : {}z\An error occurred when trying to read the filtering by polygon.
All features are hidden : {}Nz/The polygon filter subset string is not null : edition_onlyfilterAttributer~   r>   allz AND ) r   r#   rN   r   r
   r   r`   r	   r_   r   rL   r   r   rX   is_filteredis_validr   criticalformatr   is_filtered_by_usertuple
subset_sql	Exceptionlog_exceptionr&   r   r   r   createFieldEqualityExpression_filter_by_logindataProvider)r'   r+   r.   rl   rm   rs   ru   ri   edition_contextfilter_polygon_configpolygon_filtergroups_or_user_ecfg_layer_login_filteris_edition_only	attributelogin_filters                     r)   r/   z1LizmapAccessControlFilter.get_lizmap_layer_filter*  s    &djj&?&?&AB #4::#<#<#>?*4::+D+D+FG
 v;!J  

 9 9 ;< .c2
 ZZ\
Z'	01J1J1LMO$3+,'	%! *N$002,557OO#VK02 '&
 "((<<>%*J<%8N$9$D$D^$T! KKI.IYZ[ "?sJ!O%%% ),BBw'=n'MN%%*+<=	 v;!q	RJ"4D )FFyRWXL()|n==,," %%'	
 $%U<.99_  	  #OOVK(* 	s&   BI2 42I2 2	K;AK=KKr   rl   loginproviderc                    g }t        | d         r|j                  |       nt        |      }|j                  d       g }t        j                  | d         }|D ]  }g }t        j
                  |      }	|j                  | d|	        |dk(  r| j                  d      rt        j
                  | d      }
|j                  | d|
        t        j
                  d	|       }
|j                  | d|
        t        j
                  d	| d      }
|j                  | d|
        |j                  d
j                  |              d
j                  |      }|S )aH   Build the string according to the filter by login configuration.

        :param cfg_layer_login_filter: The Lizmap Filter by login configuration.
        :param groups: List of groups for the current user
        :param login: The current user
        :param provider: The layer data provider ('postgres' for example)
        filterPrivater   r   z = postgresallow_multiple_acl_valuesz,%z LIKE z%,z OR )r   appendrY   r   quotedColumnRefquotedStringrX   rg   )r   rl   r   r   valuesvalue_filtersquoted_fieldvaluefiltersquoted_valuequoted_like_valuelayer_filters               r)   r   z*LizmapAccessControlFilter._filter_by_login  sy    )/:;MM%  &\F 	e  %445KL]5^_  	7EG(55e<L NNl^3|n=> :%*@*D*DE`*a$1$>$>%|$L!,v6G5HIJ %2$>$>E7|$L!,v6G5HIJ %2$>$>E7"~$N!,v6G5HIJ   W!56/	74 {{=1r*   )__name__
__module____qualname__r   r"   r   strr1   r   r   LayerPermissionsrK   r   r   r   r/   staticmethoddictr   r   __classcell__)r(   s   @r)   r   r   "   s    d%7 dD d6	6^ 	6 	6kk k6L6]6] kZ1!# 1!f h^ h* hY\ h hT C Cu CS C\_ Cdg C Cr*   r   N)$__copyright____license__	__email__	qgis.corer   r   r   r   qgis.serverr   r   lizmap_server.corer	   r
   r   r   r   r   r   lizmap_server.filter_by_polygonr   r   r   r   lizmap_server.loggerr   r   lizmap_server.toolsr   lizmap_server.tos_definitionsr   r   r   r   r   r    r*   r)   <module>r      sW   &	 L L B    3 ' w 6 wr*   