Version 0.1.2 0.1.2
authorThierry Florac <thierry.florac@onf.fr>
Thu, 08 Oct 2015 09:39:15 +0200
changeset 55 5713898178f3
parent 54 59683c264d94
child 56 4535f42c2e59
Version 0.1.2
.installed.cfg
buildout.cfg
docs/HISTORY.txt
setup.py
src/pyams_security.egg-info/PKG-INFO
src/pyams_security.egg-info/SOURCES.txt
src/pyams_security.egg-info/requires.txt
src/pyams_security/interfaces/__init__.py
src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.mo
src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.po
src/pyams_security/locales/pyams_security.pot
src/pyams_security/utility.py
--- a/.installed.cfg	Thu Oct 08 09:31:45 2015 +0200
+++ b/.installed.cfg	Thu Oct 08 09:39:15 2015 +0200
@@ -1,31 +1,6 @@
 [buildout]
-installed_develop_eggs = 
-parts = package i18n pyflakes test
-
-[package]
-__buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pserve
-	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pshell
-	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/ptweens
-	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pcreate
-	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/proutes
-	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pdistreport
-	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/prequest
-	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pviews
-	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/zpasswd
-__buildout_signature__ = zc.recipe.egg-2.0.1-py3.4.egg setuptools-12.3-py3.4.egg zc.buildout-2.3.1-py3.4.egg
-_b = /home/tflorac/Dropbox/src/PyAMS/pyams_security/bin
-_d = /home/tflorac/Dropbox/src/PyAMS/pyams_security/develop-eggs
-_e = /var/local/env/pyams/eggs
-bin-directory = /home/tflorac/Dropbox/src/PyAMS/pyams_security/bin
-develop-eggs-directory = /home/tflorac/Dropbox/src/PyAMS/pyams_security/develop-eggs
-eggs = authomatic
-	pyams_security
-	pyramid
-	zope.component
-	zope.interface
-	zope.password
-eggs-directory = /var/local/env/pyams/eggs
-recipe = zc.recipe.egg
+installed_develop_eggs = /home/tflorac/Dropbox/src/PyAMS/pyams_security/develop-eggs/pyams-file.egg-link
+parts = i18n pyflakes test package
 
 [i18n]
 __buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pybabel
@@ -72,3 +47,37 @@
 location = /home/tflorac/Dropbox/src/PyAMS/pyams_security/parts/test
 recipe = zc.recipe.testrunner
 script = /home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/test
+
+[package]
+__buildout_installed__ = /home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pdistreport
+	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pcreate
+	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pserve
+	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/prequest
+	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pshell
+	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/ptweens
+	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/proutes
+	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/pviews
+	/home/tflorac/Dropbox/src/PyAMS/pyams_security/bin/zpasswd
+__buildout_signature__ = zc.recipe.egg-2.0.1-py3.4.egg setuptools-12.3-py3.4.egg zc.buildout-2.3.1-py3.4.egg
+_b = /home/tflorac/Dropbox/src/PyAMS/pyams_security/bin
+_d = /home/tflorac/Dropbox/src/PyAMS/pyams_security/develop-eggs
+_e = /var/local/env/pyams/eggs
+bin-directory = /home/tflorac/Dropbox/src/PyAMS/pyams_security/bin
+develop-eggs-directory = /home/tflorac/Dropbox/src/PyAMS/pyams_security/develop-eggs
+eggs = authomatic
+	pyams_security
+	pyramid
+	zope.component
+	zope.interface
+	zope.password
+eggs-directory = /var/local/env/pyams/eggs
+recipe = zc.recipe.egg
+
+[buildout]
+parts = pyflakes test package i18n
+
+[buildout]
+parts = test package i18n pyflakes
+
+[buildout]
+parts = package i18n pyflakes test
--- a/buildout.cfg	Thu Oct 08 09:31:45 2015 +0200
+++ b/buildout.cfg	Thu Oct 08 09:39:15 2015 +0200
@@ -19,6 +19,7 @@
 src = src
 develop =
     .
+    /var/local/src/pyams/pyams_file
     /var/local/src/pyams/pyams_utils
     /var/local/src/pyams/ext/lingua
 
@@ -61,4 +62,4 @@
 eggs = pyams_security [test]
 
 [versions]
-pyams_security = 0.1.1
+pyams_security = 0.1.2
--- a/docs/HISTORY.txt	Thu Oct 08 09:31:45 2015 +0200
+++ b/docs/HISTORY.txt	Thu Oct 08 09:39:15 2015 +0200
@@ -0,0 +1,17 @@
+History
+=======
+
+0.1.2
+-----
+ - changed menus icon class
+ - use named permissions
+
+0.1.1
+-----
+ - changed vocabulary interface provider
+ - added properties to security manager to correctly handle denied permissions
+ - handle recursivity in groups
+
+0.1.0
+-----
+ - initial release
--- a/setup.py	Thu Oct 08 09:31:45 2015 +0200
+++ b/setup.py	Thu Oct 08 09:39:15 2015 +0200
@@ -22,7 +22,7 @@
 README = os.path.join(DOCS, 'README.txt')
 HISTORY = os.path.join(DOCS, 'HISTORY.txt')
 
-version = '0.1.1'
+version = '0.1.2'
 long_description = open(README).read() + '\n\n' + open(HISTORY).read()
 
 tests_require = []
@@ -58,6 +58,7 @@
           # -*- Extra requirements: -*-
           'authomatic',
           'fanstatic',
+          'pyams_file',
           'pyramid',
           'zope.component',
           'zope.interface',
--- a/src/pyams_security.egg-info/PKG-INFO	Thu Oct 08 09:31:45 2015 +0200
+++ b/src/pyams_security.egg-info/PKG-INFO	Thu Oct 08 09:39:15 2015 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: pyams-security
-Version: 0.1.1
+Version: 0.1.2
 Summary: PyAMS security interfaces and classes
 Home-page: http://hg.ztfy.org/pyams/pyams_security
 Author: Thierry Florac
@@ -103,6 +103,22 @@
                 si l'inscription "libre" est autorisée
         
         
+        History
+        =======
+        
+        0.1.2
+        -----
+         - changed menus icon class
+        
+        0.1.1
+        -----
+         - changed vocabulary interface provider
+         - added properties to security manager to correctly handle denied permissions
+         - handle recursivity in groups
+        
+        0.1.0
+        -----
+         - initial release
         
 Keywords: Pyramid PyAMS security authentication
 Platform: UNKNOWN
--- a/src/pyams_security.egg-info/SOURCES.txt	Thu Oct 08 09:31:45 2015 +0200
+++ b/src/pyams_security.egg-info/SOURCES.txt	Thu Oct 08 09:39:15 2015 +0200
@@ -10,6 +10,7 @@
 src/pyams_security/notification.py
 src/pyams_security/permission.py
 src/pyams_security/principal.py
+src/pyams_security/profile.py
 src/pyams_security/property.py
 src/pyams_security/role.py
 src/pyams_security/schema.py
@@ -28,6 +29,7 @@
 src/pyams_security/doctests/README.txt
 src/pyams_security/interfaces/__init__.py
 src/pyams_security/interfaces/notification.py
+src/pyams_security/interfaces/profile.py
 src/pyams_security/locales/pyams_security.pot
 src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.mo
 src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.po
@@ -78,6 +80,7 @@
 src/pyams_security/views/oauth.py
 src/pyams_security/views/userfolder.py
 src/pyams_security/views/utility.py
+src/pyams_security/views/templates/login-header.pt
 src/pyams_security/views/templates/social-login.pt
 src/pyams_security/views/templates/user-registration-end.pt
 src/pyams_security/views/templates/user-registration.pt
@@ -88,12 +91,14 @@
 src/pyams_security/widget/templates/permissions-set-display.pt
 src/pyams_security/widget/templates/permissions-set-input.pt
 src/pyams_security/widget/templates/principal-display.pt
+src/pyams_security/widget/templates/principal-hidden.pt
 src/pyams_security/widget/templates/principal-input.pt
 src/pyams_security/widget/templates/principals-set-display.pt
 src/pyams_security/widget/templates/principals-set-input.pt
 src/pyams_security/zmi/__init__.py
 src/pyams_security/zmi/interfaces.py
 src/pyams_security/zmi/notification.py
+src/pyams_security/zmi/profile.py
 src/pyams_security/zmi/security.py
 src/pyams_security/zmi/utility.py
 src/pyams_security/zmi/plugin/__init__.py
--- a/src/pyams_security.egg-info/requires.txt	Thu Oct 08 09:31:45 2015 +0200
+++ b/src/pyams_security.egg-info/requires.txt	Thu Oct 08 09:39:15 2015 +0200
@@ -1,6 +1,7 @@
 setuptools
 authomatic
 fanstatic
+pyams_file
 pyramid
 zope.component
 zope.interface
--- a/src/pyams_security/interfaces/__init__.py	Thu Oct 08 09:31:45 2015 +0200
+++ b/src/pyams_security/interfaces/__init__.py	Thu Oct 08 09:39:15 2015 +0200
@@ -33,7 +33,9 @@
 from pyams_security import _
 
 
-FORBIDDEN_PERMISSION = 'system.forbidden'
+#
+# Permissions constants and interfaces
+#
 
 
 class IPermission(Interface):
Binary file src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.mo has changed
--- a/src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.po	Thu Oct 08 09:31:45 2015 +0200
+++ b/src/pyams_security/locales/fr/LC_MESSAGES/pyams_security.po	Thu Oct 08 09:39:15 2015 +0200
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2015-06-01 14:47+0200\n"
+"POT-Creation-Date: 2015-09-25 16:58+0200\n"
 "PO-Revision-Date: 2015-02-18 22:19+0100\n"
 "Last-Translator: Thierry Florac <tflorac@ulthar.net>\n"
 "Language-Team: French\n"
@@ -16,35 +16,35 @@
 "Generated-By: Lingua 3.8\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: src/pyams_security/__init__.py:33
+#: src/pyams_security/__init__.py:36
 msgid "View public contents"
 msgstr "Voir les contenus publics"
 
-#: src/pyams_security/__init__.py:35
+#: src/pyams_security/__init__.py:38
 msgid "View protected contents"
 msgstr "Voir les contenus protégés"
 
-#: src/pyams_security/__init__.py:37
+#: src/pyams_security/__init__.py:40
 msgid "Manage contents properties"
 msgstr "Gérer les propriétés des contenus"
 
-#: src/pyams_security/__init__.py:39
+#: src/pyams_security/__init__.py:42
 msgid "View management screens"
 msgstr "Voir les propriétés du système"
 
-#: src/pyams_security/__init__.py:41
+#: src/pyams_security/__init__.py:44
 msgid "Manage system properties"
 msgstr "Gérer les propriétés du système"
 
-#: src/pyams_security/__init__.py:44
+#: src/pyams_security/__init__.py:47
 msgid "Manage security"
 msgstr "Gérer les paramètres de sécurité"
 
-#: src/pyams_security/__init__.py:46
+#: src/pyams_security/__init__.py:49
 msgid "Manage roles"
 msgstr "Gérer l'attribution des rôles"
 
-#: src/pyams_security/principal.py:53
+#: src/pyams_security/principal.py:57
 msgid "Not logged in"
 msgstr "Non connecté"
 
@@ -59,56 +59,58 @@
 msgid "Select permissions..."
 msgstr "Sélectionner des permissions..."
 
-#: src/pyams_security/zmi/utility.py:75
+#: src/pyams_security/zmi/utility.py:77
 msgid "Security"
 msgstr "Sécurité"
 
-#: src/pyams_security/zmi/utility.py:84
+#: src/pyams_security/zmi/utility.py:86
 msgid "Authentication and users directory plug-ins"
 msgstr "Modules d'authentification et dossiers utilisateurs"
 
-#: src/pyams_security/zmi/utility.py:104
+#: src/pyams_security/zmi/utility.py:106
 msgid "See plug-in contents"
 msgstr "Voir le contenu du module"
 
-#: src/pyams_security/zmi/utility.py:119
-#: src/pyams_security/zmi/plugin/social.py:195
-#: src/pyams_security/zmi/plugin/social.py:328
-#: src/pyams_security/zmi/plugin/userfolder.py:192
-#: src/pyams_security/zmi/plugin/group.py:159
-#: src/pyams_security/interfaces/__init__.py:246
+#: src/pyams_security/zmi/utility.py:121
+#: src/pyams_security/zmi/plugin/social.py:198
+#: src/pyams_security/zmi/plugin/social.py:331
+#: src/pyams_security/zmi/plugin/userfolder.py:193
+#: src/pyams_security/zmi/plugin/group.py:161
+#: src/pyams_security/interfaces/__init__.py:251
 msgid "Name"
 msgstr "Nom"
 
-#: src/pyams_security/zmi/utility.py:128
+#: src/pyams_security/zmi/utility.py:130
 msgid "Delete plug-in"
 msgstr "Supprimer ce module"
 
+#: src/pyams_security/zmi/utility.py:161
+msgid "Control panel"
+msgstr "Panneau de configuration"
+
 #: src/pyams_security/zmi/utility.py:162
-#: src/pyams_security/zmi/plugin/social.py:370
-#: src/pyams_security/zmi/plugin/social.py:388
-#: src/pyams_security/zmi/plugin/social.py:443
+#: src/pyams_security/zmi/plugin/social.py:373
+#: src/pyams_security/zmi/plugin/social.py:391
+#: src/pyams_security/zmi/plugin/social.py:446
+#: src/pyams_security/zmi/plugin/userfolder.py:157
+#: src/pyams_security/zmi/plugin/group.py:196
 msgid "Security manager"
 msgstr "Gestionnaire de sécurité"
 
-#: src/pyams_security/zmi/utility.py:163
-msgid "Security manager plug-ins"
-msgstr "Modules du gestionnaire de sécurité"
-
-#: src/pyams_security/zmi/utility.py:171
+#: src/pyams_security/zmi/utility.py:170
 msgid "Properties..."
 msgstr "Propriétés..."
 
-#: src/pyams_security/zmi/utility.py:184
-#: src/pyams_security/zmi/notification.py:58
-#: src/pyams_security/zmi/plugin/social.py:79
-#: src/pyams_security/zmi/plugin/userfolder.py:76
-#: src/pyams_security/zmi/plugin/group.py:72
-#: src/pyams_security/zmi/plugin/admin.py:63
+#: src/pyams_security/zmi/utility.py:183
+#: src/pyams_security/zmi/notification.py:60
+#: src/pyams_security/zmi/plugin/social.py:81
+#: src/pyams_security/zmi/plugin/userfolder.py:78
+#: src/pyams_security/zmi/plugin/group.py:74
+#: src/pyams_security/zmi/plugin/admin.py:65
 msgid "System security manager"
 msgstr "Gestionnaire de sécurité"
 
-#: src/pyams_security/zmi/utility.py:185
+#: src/pyams_security/zmi/utility.py:184
 msgid "Security manager properties"
 msgstr "Propriétés du gestionnaire de sécurité"
 
@@ -117,12 +119,12 @@
 msgstr "Modules"
 
 #: src/pyams_security/zmi/utility.py:207
-#: src/pyams_security/interfaces/__init__.py:552
+#: src/pyams_security/interfaces/__init__.py:557
 msgid "Enable social login?"
 msgstr "Activer les réseaux sociaux ?"
 
 #: src/pyams_security/zmi/utility.py:214
-#: src/pyams_security/interfaces/__init__.py:576
+#: src/pyams_security/interfaces/__init__.py:581
 msgid "Enable free registration?"
 msgstr "Activer l'inscription libre ?"
 
@@ -134,240 +136,247 @@
 msgid "Given plug-in name doesn't exist!"
 msgstr "Le module indiqué n'existe pas !"
 
-#: src/pyams_security/zmi/notification.py:45
+#: src/pyams_security/zmi/notification.py:46
 msgid "Notifications..."
 msgstr "Notifications..."
 
-#: src/pyams_security/zmi/notification.py:59
+#: src/pyams_security/zmi/notification.py:61
 msgid "Notifications properties"
 msgstr "Paramétrage des notifications"
 
-#: src/pyams_security/zmi/security.py:46
-msgid "Access rules..."
-msgstr "Règles d'accès..."
+#: src/pyams_security/zmi/profile.py:42
+msgid "User profile"
+msgstr "Profil utilisateur"
+
+#: src/pyams_security/zmi/profile.py:54
+msgid "Edit user profile"
+msgstr "Modification du profil utilisateur"
 
-#: src/pyams_security/zmi/security.py:71
-msgid "Security management"
-msgstr "Paramètres de sécurité"
+#: src/pyams_security/zmi/profile.py:78
+msgid "Public profile"
+msgstr "Profil public"
 
-#: src/pyams_security/zmi/security.py:93
-msgid "Granted roles"
+#: src/pyams_security/zmi/security.py:58
+msgid "Access rules"
+msgstr "Droits d'accès"
+
+#: src/pyams_security/zmi/security.py:70
+msgid "Granted users roles"
 msgstr "Affectation des rôles"
 
-#: src/pyams_security/zmi/security.py:83 src/pyams_security/zmi/security.py:84
-msgid "(inherit from parent)"
-msgstr "(héritée du parent)"
+#: src/pyams_security/zmi/security.py:117
+msgid "Security policy..."
+msgstr "Politique de sécurité..."
 
-#: src/pyams_security/zmi/plugin/social.py:68
+#: src/pyams_security/zmi/security.py:128
+msgid "Update security policy"
+msgstr "Mise à jour de la politique de sécurité"
+
+#: src/pyams_security/zmi/plugin/social.py:70
 msgid "Add social users folder..."
 msgstr "Ajouter un dossier pour les réseaux sociaux..."
 
-#: src/pyams_security/zmi/plugin/social.py:80
+#: src/pyams_security/zmi/plugin/social.py:82
 msgid "Add social users folder plug-in"
 msgstr "Ajout d'un dossier pour les réseaux sociaux"
 
-#: src/pyams_security/zmi/plugin/social.py:122
+#: src/pyams_security/zmi/plugin/social.py:124
 msgid "Edit social users folder plug-in properties"
 msgstr "Modification d'un dossier pour les réseaux sociaux"
 
-#: src/pyams_security/zmi/plugin/social.py:163
-#: src/pyams_security/zmi/plugin/userfolder.py:160
+#: src/pyams_security/zmi/plugin/social.py:166
 msgid "Search users"
 msgstr "Rechercher des utilisateurs"
 
-#: src/pyams_security/zmi/plugin/social.py:172
-#: src/pyams_security/zmi/plugin/userfolder.py:169
+#: src/pyams_security/zmi/plugin/social.py:175
+#: src/pyams_security/zmi/plugin/userfolder.py:170
 msgid "Search results"
 msgstr "Résultats de la recherche"
 
-#: src/pyams_security/zmi/plugin/social.py:185
+#: src/pyams_security/zmi/plugin/social.py:188
 msgid "User ID"
 msgstr "ID utilisateur"
 
-#: src/pyams_security/zmi/plugin/social.py:205
-#: src/pyams_security/zmi/plugin/userfolder.py:202
-#: src/pyams_security/interfaces/__init__.py:257
-#: src/pyams_security/interfaces/__init__.py:333
+#: src/pyams_security/zmi/plugin/social.py:208
+#: src/pyams_security/zmi/plugin/userfolder.py:203
+#: src/pyams_security/interfaces/__init__.py:262
+#: src/pyams_security/interfaces/__init__.py:338
 msgid "E-mail address"
 msgstr "Adresse de messagerie"
 
-#: src/pyams_security/zmi/plugin/social.py:215
-#: src/pyams_security/interfaces/__init__.py:241
+#: src/pyams_security/zmi/plugin/social.py:218
+#: src/pyams_security/interfaces/__init__.py:246
 msgid "OAuth provider name"
 msgstr "Nom du fournisseur"
 
-#: src/pyams_security/zmi/plugin/social.py:225
-#: src/pyams_security/zmi/plugin/userfolder.py:212
-#: src/pyams_security/interfaces/__init__.py:281
+#: src/pyams_security/zmi/plugin/social.py:228
+#: src/pyams_security/zmi/plugin/userfolder.py:213
+#: src/pyams_security/interfaces/__init__.py:286
 msgid "Registration date"
 msgstr "Date d'enregistrement"
 
-#: src/pyams_security/zmi/plugin/social.py:248
-#: src/pyams_security/zmi/plugin/userfolder.py:333
+#: src/pyams_security/zmi/plugin/social.py:251
+#: src/pyams_security/zmi/plugin/userfolder.py:335
 msgid "Edit user properties"
 msgstr "Modification des propriétés d'un utilisateur"
 
-#: src/pyams_security/zmi/plugin/social.py:280
+#: src/pyams_security/zmi/plugin/social.py:283
 msgid "Social networks login"
 msgstr "Connexions aux réseaux sociaux"
 
-#: src/pyams_security/zmi/plugin/social.py:288
+#: src/pyams_security/zmi/plugin/social.py:291
 msgid "Configured social networks login providers"
 msgstr "Connecteurs d'accès aux réseaux sociaux"
 
-#: src/pyams_security/zmi/plugin/social.py:318
+#: src/pyams_security/zmi/plugin/social.py:321
 msgid "ID"
 msgstr "ID"
 
-#: src/pyams_security/zmi/plugin/social.py:337
+#: src/pyams_security/zmi/plugin/social.py:340
 msgid "Delete provider"
 msgstr "Supprimer ce connecteur"
 
-#: src/pyams_security/zmi/plugin/social.py:371
+#: src/pyams_security/zmi/plugin/social.py:374
 msgid "Social networks login providers"
 msgstr "Accès aux réseaux sociaux"
 
-#: src/pyams_security/zmi/plugin/social.py:379
+#: src/pyams_security/zmi/plugin/social.py:382
 msgid "Add provider"
 msgstr "Ajouter un connecteur"
 
-#: src/pyams_security/zmi/plugin/social.py:389
+#: src/pyams_security/zmi/plugin/social.py:392
 msgid "Add new social login provider"
 msgstr "Ajout d'un nouveau connecteur"
 
-#: src/pyams_security/zmi/plugin/social.py:444
+#: src/pyams_security/zmi/plugin/social.py:447
 msgid "Edit social login provider properties"
 msgstr "Modification d'un connecteur"
 
-#: src/pyams_security/zmi/plugin/social.py:104
-#: src/pyams_security/zmi/plugin/userfolder.py:101
-#: src/pyams_security/zmi/plugin/group.py:97
-#: src/pyams_security/zmi/plugin/admin.py:89
+#: src/pyams_security/zmi/plugin/social.py:106
+#: src/pyams_security/zmi/plugin/userfolder.py:103
+#: src/pyams_security/zmi/plugin/group.py:99
+#: src/pyams_security/zmi/plugin/admin.py:91
 msgid "Specified prefix is already used!"
 msgstr "Ce préfixe est déjà utilisé !"
 
-#: src/pyams_security/zmi/plugin/social.py:419
+#: src/pyams_security/zmi/plugin/social.py:422
 msgid "This provider is already defined!"
 msgstr "Un connecteur pour ce réseau social est déjà défini !"
 
-#: src/pyams_security/zmi/plugin/social.py:435
+#: src/pyams_security/zmi/plugin/social.py:438
 msgid "Social provider was created successfully"
 msgstr "Le connecteur a été créé avec succès."
 
-#: src/pyams_security/zmi/plugin/social.py:422
+#: src/pyams_security/zmi/plugin/social.py:425
 msgid "This provider ID is already used!"
 msgstr "L'ID de ce connecteur est déjà utilisé !"
 
-#: src/pyams_security/zmi/plugin/social.py:475
+#: src/pyams_security/zmi/plugin/social.py:478
 msgid "No provided provider_name argument!"
 msgstr "Argument 'provider_name' non fourni !"
 
-#: src/pyams_security/zmi/plugin/social.py:479
+#: src/pyams_security/zmi/plugin/social.py:482
 msgid "Given provider name doesn't exist!"
 msgstr "Le connecteur indiqué n'existe pas !"
 
-#: src/pyams_security/zmi/plugin/userfolder.py:65
+#: src/pyams_security/zmi/plugin/userfolder.py:67
 msgid "Add local users folder..."
 msgstr "Ajouter un dossier d'utilisateurs locaux..."
 
-#: src/pyams_security/zmi/plugin/userfolder.py:77
+#: src/pyams_security/zmi/plugin/userfolder.py:79
 msgid "Add local users folder plug-in"
 msgstr "Ajout d'un dossier d'utilisateurs locaux"
 
-#: src/pyams_security/zmi/plugin/userfolder.py:119
+#: src/pyams_security/zmi/plugin/userfolder.py:121
 msgid "Edit local users folder plug-in properties"
 msgstr "Modification d'un dossier d'utilisateurs locaux"
 
-#: src/pyams_security/zmi/plugin/userfolder.py:182
+#: src/pyams_security/zmi/plugin/userfolder.py:183
 #: src/pyams_security/views/login.py:56
 msgid "Login"
 msgstr "Code utilisateur"
 
-#: src/pyams_security/zmi/plugin/userfolder.py:228
-#: src/pyams_security/interfaces/__init__.py:455
-#: src/pyams_security/interfaces/__init__.py:458
+#: src/pyams_security/zmi/plugin/userfolder.py:229
+#: src/pyams_security/interfaces/__init__.py:460
+#: src/pyams_security/interfaces/__init__.py:463
 msgid "Activation date"
 msgstr "Date d'activation"
 
-#: src/pyams_security/zmi/plugin/userfolder.py:248
+#: src/pyams_security/zmi/plugin/userfolder.py:249
 msgid "Add user"
 msgstr "Ajouter un utilisateur"
 
-#: src/pyams_security/zmi/plugin/userfolder.py:261
+#: src/pyams_security/zmi/plugin/userfolder.py:263
 msgid "Add new local user"
 msgstr "Ajout d'un utilisateur local"
 
-#: src/pyams_security/zmi/plugin/userfolder.py:311
+#: src/pyams_security/zmi/plugin/userfolder.py:313
 #: src/pyams_security/views/userfolder.py:124
 msgid "Specified login can't be used!"
 msgstr "Le code utilisateur indiqué ne peut pas être utilisé !"
 
-#: src/pyams_security/zmi/plugin/userfolder.py:322
+#: src/pyams_security/zmi/plugin/userfolder.py:324
 msgid "User was created successfully"
 msgstr "L'utilisateur a été créé avec succès."
 
-#: src/pyams_security/zmi/plugin/group.py:61
+#: src/pyams_security/zmi/plugin/group.py:63
 msgid "Add local groups folder..."
 msgstr "Ajouter un dossier de groupes locaux..."
 
-#: src/pyams_security/zmi/plugin/group.py:73
+#: src/pyams_security/zmi/plugin/group.py:75
 msgid "Add local groups folder plug-in"
 msgstr "Ajout d'un dossier de groupes locaux"
 
-#: src/pyams_security/zmi/plugin/group.py:115
+#: src/pyams_security/zmi/plugin/group.py:117
 msgid "Edit local groups folder plug-in properties"
 msgstr "Modification d'un dossier de groupes locaux"
 
-#: src/pyams_security/zmi/plugin/group.py:141
-msgid "Local groups"
-msgstr "Groupes locaux"
+#: src/pyams_security/zmi/plugin/group.py:143
+msgid "Local groups list"
+msgstr "Liste des groupes locaux"
 
-#: src/pyams_security/zmi/plugin/group.py:169
-#: src/pyams_security/interfaces/__init__.py:499
+#: src/pyams_security/zmi/plugin/group.py:171
+#: src/pyams_security/interfaces/__init__.py:504
 msgid "Description"
 msgstr "Description"
 
-#: src/pyams_security/zmi/plugin/group.py:199
-msgid "Groups list"
-msgstr "Liste des groupes"
-
-#: src/pyams_security/zmi/plugin/group.py:212
+#: src/pyams_security/zmi/plugin/group.py:213
 msgid "Add group"
 msgstr "Ajouter un groupe"
 
-#: src/pyams_security/zmi/plugin/group.py:225
+#: src/pyams_security/zmi/plugin/group.py:227
 msgid "Add new local group"
 msgstr "Ajout d'un groupe local"
 
-#: src/pyams_security/zmi/plugin/group.py:281
+#: src/pyams_security/zmi/plugin/group.py:283
 msgid "Edit group properties"
 msgstr "Modification des propriétés d'un groupe"
 
-#: src/pyams_security/zmi/plugin/group.py:258
+#: src/pyams_security/zmi/plugin/group.py:260
 msgid "Specified group ID can't be used!"
 msgstr "L'ID indiqué pour ce groupe ne peut pas être utilisé !"
 
-#: src/pyams_security/zmi/plugin/group.py:270
+#: src/pyams_security/zmi/plugin/group.py:272
 msgid "Group was created successfully"
 msgstr "Le groupe a été créé avec succès."
 
-#: src/pyams_security/zmi/plugin/admin.py:52
+#: src/pyams_security/zmi/plugin/admin.py:54
 msgid "Add admin authentication..."
 msgstr "Ajouter un compte système..."
 
-#: src/pyams_security/zmi/plugin/admin.py:64
+#: src/pyams_security/zmi/plugin/admin.py:66
 msgid "Add administration authentication plug-in"
 msgstr "Ajout d'un compte d'administration système"
 
-#: src/pyams_security/zmi/plugin/admin.py:107
+#: src/pyams_security/zmi/plugin/admin.py:109
 msgid "Edit administration authentication plug-in"
 msgstr "Modification d'un compte d'administration système"
 
-#: src/pyams_security/zmi/plugin/admin.py:130
+#: src/pyams_security/zmi/plugin/admin.py:132
 msgid "WARNING"
 msgstr "ATTENTION"
 
-#: src/pyams_security/zmi/plugin/admin.py:132
+#: src/pyams_security/zmi/plugin/admin.py:134
 msgid ""
 "Before disabling plug-in, please verify that you have other administration "
 "access!"
@@ -396,7 +405,7 @@
 msgstr "Veuillez confirmer les paramètres de votre compte"
 
 #: src/pyams_security/views/userfolder.py:65
-#: src/pyams_security/views/login.py:140
+#: src/pyams_security/views/login.py:142
 msgid "Cancel"
 msgstr "Annuler"
 
@@ -437,14 +446,14 @@
 msgid "Can't retrieve user profile!"
 msgstr "Impossible d'accéder à votre compte utilisateur !"
 
-#: src/pyams_security/views/login.py:90 src/pyams_security/views/login.py:149
+#: src/pyams_security/views/login.py:90 src/pyams_security/views/login.py:151
 msgid "Please enter valid credentials to log-in"
 msgstr "Veuillez indiquer vos paramètres de connexion"
 
 #: src/pyams_security/views/login.py:57
-#: src/pyams_security/interfaces/__init__.py:352
-#: src/pyams_security/interfaces/__init__.py:378
-#: src/pyams_security/interfaces/__init__.py:430
+#: src/pyams_security/interfaces/__init__.py:357
+#: src/pyams_security/interfaces/__init__.py:383
+#: src/pyams_security/interfaces/__init__.py:435
 msgid "Password"
 msgstr "Mot de passe"
 
@@ -452,7 +461,7 @@
 msgid "Reset"
 msgstr "Annuler"
 
-#: src/pyams_security/views/login.py:64 src/pyams_security/views/login.py:141
+#: src/pyams_security/views/login.py:64 src/pyams_security/views/login.py:143
 msgid "Connect"
 msgstr "Connexion"
 
@@ -483,92 +492,92 @@
 msgid "Return to home page"
 msgstr "Retourner à la page d'accueil"
 
-#: src/pyams_security/interfaces/__init__.py:137
+#: src/pyams_security/interfaces/__init__.py:142
 msgid "Plug-in prefix"
 msgstr "Préfixe du module"
 
-#: src/pyams_security/interfaces/__init__.py:138
+#: src/pyams_security/interfaces/__init__.py:143
 msgid ""
 "This prefix is mainly used by authentication plug-ins to mark principals"
 msgstr ""
 "Ce préfixe est utilisé par les modules d'authentification pour identifier "
 "les utilisateurs"
 
-#: src/pyams_security/interfaces/__init__.py:140
+#: src/pyams_security/interfaces/__init__.py:145
 msgid "Plug-in title"
 msgstr "Libellé du module"
 
-#: src/pyams_security/interfaces/__init__.py:143
+#: src/pyams_security/interfaces/__init__.py:148
 msgid "Enabled plug-in?"
 msgstr "Module actif ?"
 
-#: src/pyams_security/interfaces/__init__.py:144
+#: src/pyams_security/interfaces/__init__.py:149
 msgid "You can choose to disable any plug-in..."
 msgstr ""
 "Un module inactif ne peut plus être utilisé pour authentifier ou rechercher "
 "les utilisateurs..."
 
-#: src/pyams_security/interfaces/__init__.py:179
+#: src/pyams_security/interfaces/__init__.py:184
 msgid "Admin. login"
 msgstr "Code utilisateur"
 
-#: src/pyams_security/interfaces/__init__.py:181
+#: src/pyams_security/interfaces/__init__.py:186
 msgid "Admin. password"
 msgstr "Mot de passe"
 
-#: src/pyams_security/interfaces/__init__.py:239
+#: src/pyams_security/interfaces/__init__.py:244
 msgid "Internal provider ID"
 msgstr "ID du connecteur"
 
-#: src/pyams_security/interfaces/__init__.py:243
+#: src/pyams_security/interfaces/__init__.py:248
 msgid "User name"
 msgstr "Nom d'utilisateur"
 
-#: src/pyams_security/interfaces/__init__.py:248
-#: src/pyams_security/interfaces/__init__.py:343
-#: src/pyams_security/interfaces/__init__.py:414
+#: src/pyams_security/interfaces/__init__.py:253
+#: src/pyams_security/interfaces/__init__.py:348
+#: src/pyams_security/interfaces/__init__.py:419
 msgid "First name"
 msgstr "Prénom"
 
-#: src/pyams_security/interfaces/__init__.py:251
-#: src/pyams_security/interfaces/__init__.py:346
-#: src/pyams_security/interfaces/__init__.py:417
+#: src/pyams_security/interfaces/__init__.py:256
+#: src/pyams_security/interfaces/__init__.py:351
+#: src/pyams_security/interfaces/__init__.py:422
 msgid "Last name"
 msgstr "Nom"
 
-#: src/pyams_security/interfaces/__init__.py:254
+#: src/pyams_security/interfaces/__init__.py:259
 msgid "Nickname"
 msgstr "Surnom"
 
-#: src/pyams_security/interfaces/__init__.py:260
+#: src/pyams_security/interfaces/__init__.py:265
 msgid "Timezone"
 msgstr "Fuseau horaire"
 
-#: src/pyams_security/interfaces/__init__.py:263
+#: src/pyams_security/interfaces/__init__.py:268
 msgid "Country"
 msgstr "Pays"
 
-#: src/pyams_security/interfaces/__init__.py:266
+#: src/pyams_security/interfaces/__init__.py:271
 msgid "City"
 msgstr "Ville"
 
-#: src/pyams_security/interfaces/__init__.py:269
+#: src/pyams_security/interfaces/__init__.py:274
 msgid "Postal code"
 msgstr "Code postal"
 
-#: src/pyams_security/interfaces/__init__.py:272
+#: src/pyams_security/interfaces/__init__.py:277
 msgid "Locale code"
 msgstr "Langue"
 
-#: src/pyams_security/interfaces/__init__.py:275
+#: src/pyams_security/interfaces/__init__.py:280
 msgid "Picture URL"
 msgstr "Photo (URL)"
 
-#: src/pyams_security/interfaces/__init__.py:278
+#: src/pyams_security/interfaces/__init__.py:283
 msgid "Birth date"
 msgstr "Date de naissance"
 
-#: src/pyams_security/interfaces/__init__.py:314
+#: src/pyams_security/interfaces/__init__.py:319
 msgid ""
 "Your password must contain at least three of these kinds of characters: "
 "lowercase letters, uppercase letters, numbers and special characters"
@@ -576,20 +585,20 @@
 "Votre mot de passe doit contenir au moins trois de ces types de caractères : "
 "minuscules, majuscules, chiffres et autres caractères"
 
-#: src/pyams_security/interfaces/__init__.py:324
-#: src/pyams_security/interfaces/__init__.py:375
-#: src/pyams_security/interfaces/__init__.py:397
+#: src/pyams_security/interfaces/__init__.py:329
+#: src/pyams_security/interfaces/__init__.py:380
+#: src/pyams_security/interfaces/__init__.py:402
 msgid "User login"
 msgstr "Code utilisateur"
 
-#: src/pyams_security/interfaces/__init__.py:325
+#: src/pyams_security/interfaces/__init__.py:330
 msgid ""
 "If you don't provide a custom login, your login will be your email address..."
 msgstr ""
 "Si vous n'indiquez pas de code utilisateur, vous pourrez utiliser votre "
 "adresse de messagerie pour vous connecter..."
 
-#: src/pyams_security/interfaces/__init__.py:334
+#: src/pyams_security/interfaces/__init__.py:339
 msgid ""
 "An email will be sent to this address to validate account activation; it "
 "will be used as your future user login"
@@ -598,12 +607,12 @@
 "permettre d'activer votre compte ; il pourra être utilisé compte identifiant "
 "de connexion si vous n'avez pas indiqué de code utilisateur"
 
-#: src/pyams_security/interfaces/__init__.py:349
-#: src/pyams_security/interfaces/__init__.py:422
+#: src/pyams_security/interfaces/__init__.py:354
+#: src/pyams_security/interfaces/__init__.py:427
 msgid "Company name"
 msgstr "Société"
 
-#: src/pyams_security/interfaces/__init__.py:353
+#: src/pyams_security/interfaces/__init__.py:358
 msgid ""
 "Password must be at least 8 characters long, and contain at least three kins "
 "of characters between lowercase letters, uppercase letters, numbers and "
@@ -613,29 +622,29 @@
 "moins trois types de caractères parmi les lettres minuscules, les "
 "majuscules, les chiffres et les caractères spéciaux"
 
-#: src/pyams_security/interfaces/__init__.py:359
-#: src/pyams_security/interfaces/__init__.py:382
+#: src/pyams_security/interfaces/__init__.py:364
+#: src/pyams_security/interfaces/__init__.py:387
 msgid "Confirmed password"
 msgstr "Confirmation du mot de passe"
 
-#: src/pyams_security/interfaces/__init__.py:372
-#: src/pyams_security/interfaces/__init__.py:449
+#: src/pyams_security/interfaces/__init__.py:377
+#: src/pyams_security/interfaces/__init__.py:454
 msgid "Activation hash"
 msgstr "Clé d'activation"
 
-#: src/pyams_security/interfaces/__init__.py:406
+#: src/pyams_security/interfaces/__init__.py:411
 msgid "User email address"
 msgstr "Adresse de messagerie"
 
-#: src/pyams_security/interfaces/__init__.py:425
+#: src/pyams_security/interfaces/__init__.py:430
 msgid "Password manager name"
 msgstr "Gestionnaire de mot de passe"
 
-#: src/pyams_security/interfaces/__init__.py:434
+#: src/pyams_security/interfaces/__init__.py:439
 msgid "Wait confirmation?"
 msgstr "Attendre la confirmation ?"
 
-#: src/pyams_security/interfaces/__init__.py:435
+#: src/pyams_security/interfaces/__init__.py:440
 msgid ""
 "If 'no', user will be activated immediately without waiting email "
 "confirmation"
@@ -643,20 +652,20 @@
 "Si 'non', ce compte utilisateur sera activé immédiatement sans attendre le "
 "message de confirmation"
 
-#: src/pyams_security/interfaces/__init__.py:440
+#: src/pyams_security/interfaces/__init__.py:445
 msgid "Self-registered profile?"
 msgstr "Profil auto-enregistré ?"
 
-#: src/pyams_security/interfaces/__init__.py:445
+#: src/pyams_security/interfaces/__init__.py:450
 msgid "Activation secret key"
 msgstr "Clé secrète"
 
-#: src/pyams_security/interfaces/__init__.py:446
+#: src/pyams_security/interfaces/__init__.py:451
 msgid "This private secret is used to create and check activation hash"
 msgstr ""
 "Cette clé secrète est utilisé pour créer et vérifier la clé d'activation"
 
-#: src/pyams_security/interfaces/__init__.py:450
+#: src/pyams_security/interfaces/__init__.py:455
 msgid ""
 "This hash is provided into activation message URL. Activation hash is "
 "missing for local users which were registered without waiting their "
@@ -666,84 +675,84 @@
 "Cette clé d'activation n'est pas définie pour les utilisateurs pour lesquels "
 "l'attente de confirmation n'a pas été demandée."
 
-#: src/pyams_security/interfaces/__init__.py:490
+#: src/pyams_security/interfaces/__init__.py:495
 msgid "Group ID"
 msgstr "ID du groupe"
 
-#: src/pyams_security/interfaces/__init__.py:491
+#: src/pyams_security/interfaces/__init__.py:496
 msgid "This ID should be unique between all groups"
 msgstr "Cet ID doit être unique pour tous les groupes"
 
-#: src/pyams_security/interfaces/__init__.py:495
+#: src/pyams_security/interfaces/__init__.py:500
 msgid "Title"
 msgstr "Nom"
 
-#: src/pyams_security/interfaces/__init__.py:496
+#: src/pyams_security/interfaces/__init__.py:501
 msgid "Public label of this group"
 msgstr "Libellé public de ce groupe"
 
-#: src/pyams_security/interfaces/__init__.py:502
+#: src/pyams_security/interfaces/__init__.py:507
 msgid "Group principals"
 msgstr "Mandants du groupe"
 
-#: src/pyams_security/interfaces/__init__.py:503
+#: src/pyams_security/interfaces/__init__.py:508
 msgid "IDs of principals contained in this group"
 msgstr "ID des mandants contenus dans ce groupe"
 
-#: src/pyams_security/interfaces/__init__.py:553
+#: src/pyams_security/interfaces/__init__.py:558
 msgid "Enable login via social OAuth plug-ins"
 msgstr ""
 "Autoriser la connexion à partir des réseaux sociaux via les modules OAuth"
 
-#: src/pyams_security/interfaces/__init__.py:557
+#: src/pyams_security/interfaces/__init__.py:562
 msgid "Social users folder"
 msgstr "Dossier des utilisateurs \"sociaux\""
 
-#: src/pyams_security/interfaces/__init__.py:558
+#: src/pyams_security/interfaces/__init__.py:563
 msgid "Name of folder used to store social users properties"
 msgstr ""
 "Nom du dossier dans lequel seront stockés les profils des utilisateurs "
 "connectés via des réseaux sociaux"
 
-#: src/pyams_security/interfaces/__init__.py:567
+#: src/pyams_security/interfaces/__init__.py:572
 msgid "Authomatic secret"
 msgstr "Clé OAuth"
 
-#: src/pyams_security/interfaces/__init__.py:568
+#: src/pyams_security/interfaces/__init__.py:573
 msgid "This secret phrase is used to encrypt Authomatic cookie"
 msgstr ""
 "Cette phrase secrète est utilisée pour crypter le cookie d'authentification"
 
-#: src/pyams_security/interfaces/__init__.py:572
+#: src/pyams_security/interfaces/__init__.py:577
 msgid "Use social popup?"
 msgstr "Connection via une popup ?"
 
-#: src/pyams_security/interfaces/__init__.py:577
+#: src/pyams_security/interfaces/__init__.py:582
 msgid "If 'Yes', any use will be able to create a new user account"
 msgstr "Si 'oui', toute personne sera à même de se créer un compte utilisateur"
 
-#: src/pyams_security/interfaces/__init__.py:581
+#: src/pyams_security/interfaces/__init__.py:586
 msgid "Users folder"
 msgstr "Dossier des utilisateurs locaux"
 
-#: src/pyams_security/interfaces/__init__.py:582
+#: src/pyams_security/interfaces/__init__.py:587
 msgid "Name of users folder used to store registered principals"
 msgstr "Nom du dossier dans lequel seront créés les utilisateurs enregistrés"
 
-#: src/pyams_security/interfaces/__init__.py:591
+#: src/pyams_security/interfaces/__init__.py:596
 msgid "Credentials plug-ins"
 msgstr "Modules d'identification"
 
-#: src/pyams_security/interfaces/__init__.py:592
+#: src/pyams_security/interfaces/__init__.py:597
 msgid "These plug-ins can be used to extract request credentials"
 msgstr ""
 "Ces modules peuvent être utilisés pour extraire l'identitité des utilisateurs"
 
-#: src/pyams_security/interfaces/__init__.py:597
+#: src/pyams_security/interfaces/__init__.py:602
 msgid "Authentication plug-ins"
 msgstr "Modules d'authentification"
 
-#: src/pyams_security/interfaces/__init__.py:598
+#: src/pyams_security/interfaces/__init__.py:603
 msgid ""
 "The plug-ins can be used to check extracted credentials against a local or "
 "remote users database"
@@ -751,88 +760,112 @@
 "Ces modules sont utilisés pour vérifier l'identité des utilisateurs vis à "
 "vis d'une base d'utilisateurs locale ou distante"
 
-#: src/pyams_security/interfaces/__init__.py:603
+#: src/pyams_security/interfaces/__init__.py:608
 msgid "Directory plug-ins"
 msgstr "Modules d'annuaires"
 
-#: src/pyams_security/interfaces/__init__.py:604
+#: src/pyams_security/interfaces/__init__.py:609
 msgid "The plug-in can be used to extract principals information"
 msgstr ""
 "Ces modules peuvent être utilisés pour extraire les propriétés des "
 "utilisateurs"
 
-#: src/pyams_security/interfaces/__init__.py:678
+#: src/pyams_security/interfaces/__init__.py:683
 msgid "Provider name"
 msgstr "Nom du fournisseur"
 
-#: src/pyams_security/interfaces/__init__.py:682
+#: src/pyams_security/interfaces/__init__.py:687
 msgid "Provider ID"
 msgstr "ID du fournisseur"
 
-#: src/pyams_security/interfaces/__init__.py:683
+#: src/pyams_security/interfaces/__init__.py:688
 msgid "This value should be unique between all providers"
 msgstr "Cette valeur numérique doit être unique pour tous les fournisseurs"
 
-#: src/pyams_security/interfaces/__init__.py:687
+#: src/pyams_security/interfaces/__init__.py:692
 msgid "Provider consumer key"
 msgstr "Clé cliente"
 
-#: src/pyams_security/interfaces/__init__.py:690
+#: src/pyams_security/interfaces/__init__.py:695
 msgid "Provider secret"
 msgstr "Clé secrète"
 
-#: src/pyams_security/interfaces/__init__.py:708
+#: src/pyams_security/interfaces/__init__.py:713
 msgid "Inherit parent security?"
 msgstr "Héritage de la sécurité ?"
 
-#: src/pyams_security/interfaces/__init__.py:709
+#: src/pyams_security/interfaces/__init__.py:714
 msgid "Get access control entries (ACE) inherited from parent levels"
 msgstr "Utiliser les règles d'accès (ACE) héritées du parent"
 
-#: src/pyams_security/interfaces/__init__.py:714
-msgid "Public permissions"
-msgstr "Permissions publiques"
+#: src/pyams_security/interfaces/__init__.py:719
+msgid "Public denied permissions"
+msgstr "Permissions publiques retirées"
 
-#: src/pyams_security/interfaces/__init__.py:715
+#: src/pyams_security/interfaces/__init__.py:720
+msgid ""
+"These permissions will be denied to all users. Denied permissions take "
+"precedence over granted ones."
+msgstr ""
+"Ces permissions seront retirées à tous les utilisateurs. Les permissions "
+"retirées sont prioritaires par rapport aux permissions accordées."
+
+#: src/pyams_security/interfaces/__init__.py:725
+msgid "Public granted permissions"
+msgstr "Permissions publiques accordées"
+
+#: src/pyams_security/interfaces/__init__.py:726
 msgid "These permissions will be granted to all users"
-msgstr "Ces permissions seront attribuées à tous les utilisateurs"
+msgstr "Ces permissions seront accordées à tous les utilisateurs"
+
+#: src/pyams_security/interfaces/__init__.py:729
+msgid "Authenticated denied permissions"
+msgstr "Permissions authentifiées retirées"
 
-#: src/pyams_security/interfaces/__init__.py:718
-msgid "Authenticated permissions"
-msgstr "Permissions authentifiées"
+#: src/pyams_security/interfaces/__init__.py:730
+msgid ""
+"These permissions will be denied to authenticated users. Denied permissions "
+"take precedence over granted ones."
+msgstr ""
+"Ces permissions seront retirées aux utilisateurs authentifiés. Les "
+"permissions retirées sont prioritaires par rapport aux permissions accordées."
 
-#: src/pyams_security/interfaces/__init__.py:719
+#: src/pyams_security/interfaces/__init__.py:735
+msgid "Authenticated granted permissions"
+msgstr "Permissions authentifiées accordées"
+
+#: src/pyams_security/interfaces/__init__.py:736
 msgid "These permissions will be granted to authenticated users"
 msgstr "Ces permissions seront attribuées à tous les utilisateurs authentifiés"
 
-#: src/pyams_security/interfaces/__init__.py:723
+#: src/pyams_security/interfaces/__init__.py:740
 msgid "Inherit parent roles?"
 msgstr "Héritage des rôles ?"
 
-#: src/pyams_security/interfaces/__init__.py:724
+#: src/pyams_security/interfaces/__init__.py:741
 msgid "Get roles granted on parent levels"
 msgstr "Disposer des rôles affectés aux niveaux parents"
 
-#: src/pyams_security/interfaces/__init__.py:341
+#: src/pyams_security/interfaces/__init__.py:346
 msgid "Your email address is not valid!"
 msgstr "Votre adresse de messagerie est incorrecte !"
 
-#: src/pyams_security/interfaces/__init__.py:365
-#: src/pyams_security/interfaces/__init__.py:388
+#: src/pyams_security/interfaces/__init__.py:370
+#: src/pyams_security/interfaces/__init__.py:393
 msgid "You didn't confirmed your password correctly!"
 msgstr "Vous n'avez pas confirmé votre mot de passe correctement !"
 
-#: src/pyams_security/interfaces/__init__.py:412
+#: src/pyams_security/interfaces/__init__.py:417
 msgid "Given email address is not valid!"
 msgstr "L'adrese de messagerie indiquée est invalide !"
 
-#: src/pyams_security/interfaces/__init__.py:565
+#: src/pyams_security/interfaces/__init__.py:570
 msgid "You can't activate social login without selecting a social users folder"
 msgstr ""
 "Vous ne pouvez pas activer la connexion via les réseaux sociaux sans "
 "sélectionner de dossier de stockage des utilisateurs"
 
-#: src/pyams_security/interfaces/__init__.py:589
+#: src/pyams_security/interfaces/__init__.py:594
 msgid "You can't activate open registration without selecting a users folder"
 msgstr ""
 "Vous ne pouvez pas activer les fonctions d'inscription libre sans "
@@ -913,6 +946,14 @@
 "Les notifications ne peuvent pas être activées si vous ne séletionnez pas un "
 "outil d'envoi de messages"
 
+#: src/pyams_security/interfaces/profile.py:33
+msgid "Profile's avatar"
+msgstr "Avatar du profil"
+
+#: src/pyams_security/interfaces/profile.py:34
+msgid "This picture will be associated to your user profile"
+msgstr "Cette image sera associée à votre profil utilisateur"
+
 #: src/pyams_security/plugin/http.py:44
 msgid "HTTP Basic credentials"
 msgstr "Authentification HTTP Basic"
@@ -991,5 +1032,17 @@
 "Vous avez créé un nouveau compte que vous devez confirmer avant de pouvoir "
 "utiliser ce service."
 
+#~ msgid "Security management"
+#~ msgstr "Paramètres de sécurité"
+
+#~ msgid "Security manager plug-ins"
+#~ msgstr "Modules du gestionnaire de sécurité"
+
+#~ msgid "(inherit from parent)"
+#~ msgstr "(héritée du parent)"
+
+#~ msgid "Groups list"
+#~ msgstr "Liste des groupes"
+
 #~ msgid "Edit local roles"
 #~ msgstr "Gestion des règles d'accès"
--- a/src/pyams_security/locales/pyams_security.pot	Thu Oct 08 09:31:45 2015 +0200
+++ b/src/pyams_security/locales/pyams_security.pot	Thu Oct 08 09:39:15 2015 +0200
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE 1.0\n"
-"POT-Creation-Date: 2015-06-01 14:47+0200\n"
+"POT-Creation-Date: 2015-09-25 16:58+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,35 +16,35 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Lingua 3.10.dev0\n"
 
-#: ./src/pyams_security/__init__.py:33
+#: ./src/pyams_security/__init__.py:36
 msgid "View public contents"
 msgstr ""
 
-#: ./src/pyams_security/__init__.py:35
+#: ./src/pyams_security/__init__.py:38
 msgid "View protected contents"
 msgstr ""
 
-#: ./src/pyams_security/__init__.py:37
+#: ./src/pyams_security/__init__.py:40
 msgid "Manage contents properties"
 msgstr ""
 
-#: ./src/pyams_security/__init__.py:39
+#: ./src/pyams_security/__init__.py:42
 msgid "View management screens"
 msgstr ""
 
-#: ./src/pyams_security/__init__.py:41
-msgid "Manage system properties"
-msgstr ""
-
 #: ./src/pyams_security/__init__.py:44
+msgid "Manage system properties"
+msgstr ""
+
+#: ./src/pyams_security/__init__.py:47
 msgid "Manage security"
 msgstr ""
 
-#: ./src/pyams_security/__init__.py:46
+#: ./src/pyams_security/__init__.py:49
 msgid "Manage roles"
 msgstr ""
 
-#: ./src/pyams_security/principal.py:53
+#: ./src/pyams_security/principal.py:57
 msgid "Not logged in"
 msgstr ""
 
@@ -59,56 +59,58 @@
 msgid "Select permissions..."
 msgstr ""
 
-#: ./src/pyams_security/zmi/utility.py:75
+#: ./src/pyams_security/zmi/utility.py:77
 msgid "Security"
 msgstr ""
 
-#: ./src/pyams_security/zmi/utility.py:84
+#: ./src/pyams_security/zmi/utility.py:86
 msgid "Authentication and users directory plug-ins"
 msgstr ""
 
-#: ./src/pyams_security/zmi/utility.py:104
+#: ./src/pyams_security/zmi/utility.py:106
 msgid "See plug-in contents"
 msgstr ""
 
-#: ./src/pyams_security/zmi/utility.py:119
-#: ./src/pyams_security/zmi/plugin/social.py:195
-#: ./src/pyams_security/zmi/plugin/social.py:328
-#: ./src/pyams_security/zmi/plugin/userfolder.py:192
-#: ./src/pyams_security/zmi/plugin/group.py:159
-#: ./src/pyams_security/interfaces/__init__.py:246
+#: ./src/pyams_security/zmi/utility.py:121
+#: ./src/pyams_security/zmi/plugin/social.py:198
+#: ./src/pyams_security/zmi/plugin/social.py:331
+#: ./src/pyams_security/zmi/plugin/userfolder.py:193
+#: ./src/pyams_security/zmi/plugin/group.py:161
+#: ./src/pyams_security/interfaces/__init__.py:251
 msgid "Name"
 msgstr ""
 
-#: ./src/pyams_security/zmi/utility.py:128
+#: ./src/pyams_security/zmi/utility.py:130
 msgid "Delete plug-in"
 msgstr ""
 
+#: ./src/pyams_security/zmi/utility.py:161
+msgid "Control panel"
+msgstr ""
+
 #: ./src/pyams_security/zmi/utility.py:162
-#: ./src/pyams_security/zmi/plugin/social.py:370
-#: ./src/pyams_security/zmi/plugin/social.py:388
-#: ./src/pyams_security/zmi/plugin/social.py:443
+#: ./src/pyams_security/zmi/plugin/social.py:373
+#: ./src/pyams_security/zmi/plugin/social.py:391
+#: ./src/pyams_security/zmi/plugin/social.py:446
+#: ./src/pyams_security/zmi/plugin/userfolder.py:157
+#: ./src/pyams_security/zmi/plugin/group.py:196
 msgid "Security manager"
 msgstr ""
 
-#: ./src/pyams_security/zmi/utility.py:163
-msgid "Security manager plug-ins"
+#: ./src/pyams_security/zmi/utility.py:170
+msgid "Properties..."
 msgstr ""
 
-#: ./src/pyams_security/zmi/utility.py:171
-msgid "Properties..."
+#: ./src/pyams_security/zmi/utility.py:183
+#: ./src/pyams_security/zmi/notification.py:60
+#: ./src/pyams_security/zmi/plugin/social.py:81
+#: ./src/pyams_security/zmi/plugin/userfolder.py:78
+#: ./src/pyams_security/zmi/plugin/group.py:74
+#: ./src/pyams_security/zmi/plugin/admin.py:65
+msgid "System security manager"
 msgstr ""
 
 #: ./src/pyams_security/zmi/utility.py:184
-#: ./src/pyams_security/zmi/notification.py:58
-#: ./src/pyams_security/zmi/plugin/social.py:79
-#: ./src/pyams_security/zmi/plugin/userfolder.py:76
-#: ./src/pyams_security/zmi/plugin/group.py:72
-#: ./src/pyams_security/zmi/plugin/admin.py:63
-msgid "System security manager"
-msgstr ""
-
-#: ./src/pyams_security/zmi/utility.py:185
 msgid "Security manager properties"
 msgstr ""
 
@@ -117,12 +119,12 @@
 msgstr ""
 
 #: ./src/pyams_security/zmi/utility.py:207
-#: ./src/pyams_security/interfaces/__init__.py:552
+#: ./src/pyams_security/interfaces/__init__.py:557
 msgid "Enable social login?"
 msgstr ""
 
 #: ./src/pyams_security/zmi/utility.py:214
-#: ./src/pyams_security/interfaces/__init__.py:576
+#: ./src/pyams_security/interfaces/__init__.py:581
 msgid "Enable free registration?"
 msgstr ""
 
@@ -134,241 +136,247 @@
 msgid "Given plug-in name doesn't exist!"
 msgstr ""
 
-#: ./src/pyams_security/zmi/notification.py:45
+#: ./src/pyams_security/zmi/notification.py:46
 msgid "Notifications..."
 msgstr ""
 
-#: ./src/pyams_security/zmi/notification.py:59
+#: ./src/pyams_security/zmi/notification.py:61
 msgid "Notifications properties"
 msgstr ""
 
-#: ./src/pyams_security/zmi/security.py:46
-msgid "Access rules..."
+#: ./src/pyams_security/zmi/profile.py:42
+msgid "User profile"
 msgstr ""
 
-#: ./src/pyams_security/zmi/security.py:71
-msgid "Security management"
+#: ./src/pyams_security/zmi/profile.py:54
+msgid "Edit user profile"
+msgstr ""
+
+#: ./src/pyams_security/zmi/profile.py:78
+msgid "Public profile"
 msgstr ""
 
-#: ./src/pyams_security/zmi/security.py:93
-msgid "Granted roles"
+#: ./src/pyams_security/zmi/security.py:58
+msgid "Access rules"
+msgstr ""
+
+#: ./src/pyams_security/zmi/security.py:70
+msgid "Granted users roles"
 msgstr ""
 
-#: ./src/pyams_security/zmi/security.py:83
-#: ./src/pyams_security/zmi/security.py:84
-msgid "(inherit from parent)"
+#: ./src/pyams_security/zmi/security.py:117
+msgid "Security policy..."
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:68
+#: ./src/pyams_security/zmi/security.py:128
+msgid "Update security policy"
+msgstr ""
+
+#: ./src/pyams_security/zmi/plugin/social.py:70
 msgid "Add social users folder..."
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:80
+#: ./src/pyams_security/zmi/plugin/social.py:82
 msgid "Add social users folder plug-in"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:122
+#: ./src/pyams_security/zmi/plugin/social.py:124
 msgid "Edit social users folder plug-in properties"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:163
-#: ./src/pyams_security/zmi/plugin/userfolder.py:160
+#: ./src/pyams_security/zmi/plugin/social.py:166
 msgid "Search users"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:172
-#: ./src/pyams_security/zmi/plugin/userfolder.py:169
+#: ./src/pyams_security/zmi/plugin/social.py:175
+#: ./src/pyams_security/zmi/plugin/userfolder.py:170
 msgid "Search results"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:185
+#: ./src/pyams_security/zmi/plugin/social.py:188
 msgid "User ID"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:205
-#: ./src/pyams_security/zmi/plugin/userfolder.py:202
-#: ./src/pyams_security/interfaces/__init__.py:257
-#: ./src/pyams_security/interfaces/__init__.py:333
+#: ./src/pyams_security/zmi/plugin/social.py:208
+#: ./src/pyams_security/zmi/plugin/userfolder.py:203
+#: ./src/pyams_security/interfaces/__init__.py:262
+#: ./src/pyams_security/interfaces/__init__.py:338
 msgid "E-mail address"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:215
-#: ./src/pyams_security/interfaces/__init__.py:241
+#: ./src/pyams_security/zmi/plugin/social.py:218
+#: ./src/pyams_security/interfaces/__init__.py:246
 msgid "OAuth provider name"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:225
-#: ./src/pyams_security/zmi/plugin/userfolder.py:212
-#: ./src/pyams_security/interfaces/__init__.py:281
+#: ./src/pyams_security/zmi/plugin/social.py:228
+#: ./src/pyams_security/zmi/plugin/userfolder.py:213
+#: ./src/pyams_security/interfaces/__init__.py:286
 msgid "Registration date"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:248
-#: ./src/pyams_security/zmi/plugin/userfolder.py:333
+#: ./src/pyams_security/zmi/plugin/social.py:251
+#: ./src/pyams_security/zmi/plugin/userfolder.py:335
 msgid "Edit user properties"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:280
+#: ./src/pyams_security/zmi/plugin/social.py:283
 msgid "Social networks login"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:288
+#: ./src/pyams_security/zmi/plugin/social.py:291
 msgid "Configured social networks login providers"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:318
+#: ./src/pyams_security/zmi/plugin/social.py:321
 msgid "ID"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:337
+#: ./src/pyams_security/zmi/plugin/social.py:340
 msgid "Delete provider"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:371
+#: ./src/pyams_security/zmi/plugin/social.py:374
 msgid "Social networks login providers"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:379
+#: ./src/pyams_security/zmi/plugin/social.py:382
 msgid "Add provider"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:389
+#: ./src/pyams_security/zmi/plugin/social.py:392
 msgid "Add new social login provider"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:444
+#: ./src/pyams_security/zmi/plugin/social.py:447
 msgid "Edit social login provider properties"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:104
-#: ./src/pyams_security/zmi/plugin/userfolder.py:101
-#: ./src/pyams_security/zmi/plugin/group.py:97
-#: ./src/pyams_security/zmi/plugin/admin.py:89
+#: ./src/pyams_security/zmi/plugin/social.py:106
+#: ./src/pyams_security/zmi/plugin/userfolder.py:103
+#: ./src/pyams_security/zmi/plugin/group.py:99
+#: ./src/pyams_security/zmi/plugin/admin.py:91
 msgid "Specified prefix is already used!"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:419
+#: ./src/pyams_security/zmi/plugin/social.py:422
 msgid "This provider is already defined!"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:435
+#: ./src/pyams_security/zmi/plugin/social.py:438
 msgid "Social provider was created successfully"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:422
+#: ./src/pyams_security/zmi/plugin/social.py:425
 msgid "This provider ID is already used!"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:475
+#: ./src/pyams_security/zmi/plugin/social.py:478
 msgid "No provided provider_name argument!"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/social.py:479
+#: ./src/pyams_security/zmi/plugin/social.py:482
 msgid "Given provider name doesn't exist!"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/userfolder.py:65
+#: ./src/pyams_security/zmi/plugin/userfolder.py:67
 msgid "Add local users folder..."
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/userfolder.py:77
+#: ./src/pyams_security/zmi/plugin/userfolder.py:79
 msgid "Add local users folder plug-in"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/userfolder.py:119
+#: ./src/pyams_security/zmi/plugin/userfolder.py:121
 msgid "Edit local users folder plug-in properties"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/userfolder.py:182
+#: ./src/pyams_security/zmi/plugin/userfolder.py:183
 #: ./src/pyams_security/views/login.py:56
 msgid "Login"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/userfolder.py:228
-#: ./src/pyams_security/interfaces/__init__.py:455
-#: ./src/pyams_security/interfaces/__init__.py:458
+#: ./src/pyams_security/zmi/plugin/userfolder.py:229
+#: ./src/pyams_security/interfaces/__init__.py:460
+#: ./src/pyams_security/interfaces/__init__.py:463
 msgid "Activation date"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/userfolder.py:248
+#: ./src/pyams_security/zmi/plugin/userfolder.py:249
 msgid "Add user"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/userfolder.py:261
+#: ./src/pyams_security/zmi/plugin/userfolder.py:263
 msgid "Add new local user"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/userfolder.py:311
+#: ./src/pyams_security/zmi/plugin/userfolder.py:313
 #: ./src/pyams_security/views/userfolder.py:124
 msgid "Specified login can't be used!"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/userfolder.py:322
+#: ./src/pyams_security/zmi/plugin/userfolder.py:324
 msgid "User was created successfully"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:61
+#: ./src/pyams_security/zmi/plugin/group.py:63
 msgid "Add local groups folder..."
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:73
+#: ./src/pyams_security/zmi/plugin/group.py:75
 msgid "Add local groups folder plug-in"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:115
+#: ./src/pyams_security/zmi/plugin/group.py:117
 msgid "Edit local groups folder plug-in properties"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:141
-msgid "Local groups"
+#: ./src/pyams_security/zmi/plugin/group.py:143
+msgid "Local groups list"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:169
-#: ./src/pyams_security/interfaces/__init__.py:499
+#: ./src/pyams_security/zmi/plugin/group.py:171
+#: ./src/pyams_security/interfaces/__init__.py:504
 msgid "Description"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:199
-msgid "Groups list"
-msgstr ""
-
-#: ./src/pyams_security/zmi/plugin/group.py:212
+#: ./src/pyams_security/zmi/plugin/group.py:213
 msgid "Add group"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:225
+#: ./src/pyams_security/zmi/plugin/group.py:227
 msgid "Add new local group"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:281
+#: ./src/pyams_security/zmi/plugin/group.py:283
 msgid "Edit group properties"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:258
+#: ./src/pyams_security/zmi/plugin/group.py:260
 msgid "Specified group ID can't be used!"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/group.py:270
+#: ./src/pyams_security/zmi/plugin/group.py:272
 msgid "Group was created successfully"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/admin.py:52
+#: ./src/pyams_security/zmi/plugin/admin.py:54
 msgid "Add admin authentication..."
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/admin.py:64
+#: ./src/pyams_security/zmi/plugin/admin.py:66
 msgid "Add administration authentication plug-in"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/admin.py:107
+#: ./src/pyams_security/zmi/plugin/admin.py:109
 msgid "Edit administration authentication plug-in"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/admin.py:130
+#: ./src/pyams_security/zmi/plugin/admin.py:132
 msgid "WARNING"
 msgstr ""
 
-#: ./src/pyams_security/zmi/plugin/admin.py:132
+#: ./src/pyams_security/zmi/plugin/admin.py:134
 msgid ""
 "Before disabling plug-in, please verify that you have other administration "
 "access!"
@@ -395,7 +403,7 @@
 msgstr ""
 
 #: ./src/pyams_security/views/userfolder.py:65
-#: ./src/pyams_security/views/login.py:140
+#: ./src/pyams_security/views/login.py:142
 msgid "Cancel"
 msgstr ""
 
@@ -430,14 +438,14 @@
 msgstr ""
 
 #: ./src/pyams_security/views/login.py:90
-#: ./src/pyams_security/views/login.py:149
+#: ./src/pyams_security/views/login.py:151
 msgid "Please enter valid credentials to log-in"
 msgstr ""
 
 #: ./src/pyams_security/views/login.py:57
-#: ./src/pyams_security/interfaces/__init__.py:352
-#: ./src/pyams_security/interfaces/__init__.py:378
-#: ./src/pyams_security/interfaces/__init__.py:430
+#: ./src/pyams_security/interfaces/__init__.py:357
+#: ./src/pyams_security/interfaces/__init__.py:383
+#: ./src/pyams_security/interfaces/__init__.py:435
 msgid "Password"
 msgstr ""
 
@@ -446,7 +454,7 @@
 msgstr ""
 
 #: ./src/pyams_security/views/login.py:64
-#: ./src/pyams_security/views/login.py:141
+#: ./src/pyams_security/views/login.py:143
 msgid "Connect"
 msgstr ""
 
@@ -474,324 +482,344 @@
 msgid "Return to home page"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:137
+#: ./src/pyams_security/interfaces/__init__.py:142
 msgid "Plug-in prefix"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:138
+#: ./src/pyams_security/interfaces/__init__.py:143
 msgid ""
 "This prefix is mainly used by authentication plug-ins to mark principals"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:140
+#: ./src/pyams_security/interfaces/__init__.py:145
 msgid "Plug-in title"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:143
+#: ./src/pyams_security/interfaces/__init__.py:148
 msgid "Enabled plug-in?"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:144
+#: ./src/pyams_security/interfaces/__init__.py:149
 msgid "You can choose to disable any plug-in..."
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:179
+#: ./src/pyams_security/interfaces/__init__.py:184
 msgid "Admin. login"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:181
+#: ./src/pyams_security/interfaces/__init__.py:186
 msgid "Admin. password"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:239
+#: ./src/pyams_security/interfaces/__init__.py:244
 msgid "Internal provider ID"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:243
+#: ./src/pyams_security/interfaces/__init__.py:248
 msgid "User name"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:248
-#: ./src/pyams_security/interfaces/__init__.py:343
-#: ./src/pyams_security/interfaces/__init__.py:414
+#: ./src/pyams_security/interfaces/__init__.py:253
+#: ./src/pyams_security/interfaces/__init__.py:348
+#: ./src/pyams_security/interfaces/__init__.py:419
 msgid "First name"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:251
-#: ./src/pyams_security/interfaces/__init__.py:346
-#: ./src/pyams_security/interfaces/__init__.py:417
+#: ./src/pyams_security/interfaces/__init__.py:256
+#: ./src/pyams_security/interfaces/__init__.py:351
+#: ./src/pyams_security/interfaces/__init__.py:422
 msgid "Last name"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:254
+#: ./src/pyams_security/interfaces/__init__.py:259
 msgid "Nickname"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:260
+#: ./src/pyams_security/interfaces/__init__.py:265
 msgid "Timezone"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:263
+#: ./src/pyams_security/interfaces/__init__.py:268
 msgid "Country"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:266
+#: ./src/pyams_security/interfaces/__init__.py:271
 msgid "City"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:269
+#: ./src/pyams_security/interfaces/__init__.py:274
 msgid "Postal code"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:272
+#: ./src/pyams_security/interfaces/__init__.py:277
 msgid "Locale code"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:275
+#: ./src/pyams_security/interfaces/__init__.py:280
 msgid "Picture URL"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:278
+#: ./src/pyams_security/interfaces/__init__.py:283
 msgid "Birth date"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:314
+#: ./src/pyams_security/interfaces/__init__.py:319
 msgid ""
 "Your password must contain at least three of these kinds of characters: "
 "lowercase letters, uppercase letters, numbers and special characters"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:324
-#: ./src/pyams_security/interfaces/__init__.py:375
-#: ./src/pyams_security/interfaces/__init__.py:397
+#: ./src/pyams_security/interfaces/__init__.py:329
+#: ./src/pyams_security/interfaces/__init__.py:380
+#: ./src/pyams_security/interfaces/__init__.py:402
 msgid "User login"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:325
+#: ./src/pyams_security/interfaces/__init__.py:330
 msgid ""
 "If you don't provide a custom login, your login will be your email address..."
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:334
+#: ./src/pyams_security/interfaces/__init__.py:339
 msgid ""
 "An email will be sent to this address to validate account activation; it will"
 " be used as your future user login"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:349
-#: ./src/pyams_security/interfaces/__init__.py:422
+#: ./src/pyams_security/interfaces/__init__.py:354
+#: ./src/pyams_security/interfaces/__init__.py:427
 msgid "Company name"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:353
+#: ./src/pyams_security/interfaces/__init__.py:358
 msgid ""
 "Password must be at least 8 characters long, and contain at least three kins "
 "of characters between lowercase letters, uppercase letters, numbers and "
 "special characters"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:359
-#: ./src/pyams_security/interfaces/__init__.py:382
+#: ./src/pyams_security/interfaces/__init__.py:364
+#: ./src/pyams_security/interfaces/__init__.py:387
 msgid "Confirmed password"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:372
-#: ./src/pyams_security/interfaces/__init__.py:449
+#: ./src/pyams_security/interfaces/__init__.py:377
+#: ./src/pyams_security/interfaces/__init__.py:454
 msgid "Activation hash"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:406
+#: ./src/pyams_security/interfaces/__init__.py:411
 msgid "User email address"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:425
+#: ./src/pyams_security/interfaces/__init__.py:430
 msgid "Password manager name"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:434
+#: ./src/pyams_security/interfaces/__init__.py:439
 msgid "Wait confirmation?"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:435
+#: ./src/pyams_security/interfaces/__init__.py:440
 msgid ""
 "If 'no', user will be activated immediately without waiting email "
 "confirmation"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:440
+#: ./src/pyams_security/interfaces/__init__.py:445
 msgid "Self-registered profile?"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:445
+#: ./src/pyams_security/interfaces/__init__.py:450
 msgid "Activation secret key"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:446
+#: ./src/pyams_security/interfaces/__init__.py:451
 msgid "This private secret is used to create and check activation hash"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:450
+#: ./src/pyams_security/interfaces/__init__.py:455
 msgid ""
 "This hash is provided into activation message URL. Activation hash is missing"
 " for local users which were registered without waiting their confirmation."
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:490
+#: ./src/pyams_security/interfaces/__init__.py:495
 msgid "Group ID"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:491
+#: ./src/pyams_security/interfaces/__init__.py:496
 msgid "This ID should be unique between all groups"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:495
+#: ./src/pyams_security/interfaces/__init__.py:500
 msgid "Title"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:496
+#: ./src/pyams_security/interfaces/__init__.py:501
 msgid "Public label of this group"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:502
+#: ./src/pyams_security/interfaces/__init__.py:507
 msgid "Group principals"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:503
+#: ./src/pyams_security/interfaces/__init__.py:508
 msgid "IDs of principals contained in this group"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:553
+#: ./src/pyams_security/interfaces/__init__.py:558
 msgid "Enable login via social OAuth plug-ins"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:557
+#: ./src/pyams_security/interfaces/__init__.py:562
 msgid "Social users folder"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:558
+#: ./src/pyams_security/interfaces/__init__.py:563
 msgid "Name of folder used to store social users properties"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:567
+#: ./src/pyams_security/interfaces/__init__.py:572
 msgid "Authomatic secret"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:568
+#: ./src/pyams_security/interfaces/__init__.py:573
 msgid "This secret phrase is used to encrypt Authomatic cookie"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:572
+#: ./src/pyams_security/interfaces/__init__.py:577
 msgid "Use social popup?"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:577
+#: ./src/pyams_security/interfaces/__init__.py:582
 msgid "If 'Yes', any use will be able to create a new user account"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:581
+#: ./src/pyams_security/interfaces/__init__.py:586
 msgid "Users folder"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:582
+#: ./src/pyams_security/interfaces/__init__.py:587
 msgid "Name of users folder used to store registered principals"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:591
+#: ./src/pyams_security/interfaces/__init__.py:596
 msgid "Credentials plug-ins"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:592
+#: ./src/pyams_security/interfaces/__init__.py:597
 msgid "These plug-ins can be used to extract request credentials"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:597
+#: ./src/pyams_security/interfaces/__init__.py:602
 msgid "Authentication plug-ins"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:598
+#: ./src/pyams_security/interfaces/__init__.py:603
 msgid ""
 "The plug-ins can be used to check extracted credentials against a local or "
 "remote users database"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:603
+#: ./src/pyams_security/interfaces/__init__.py:608
 msgid "Directory plug-ins"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:604
+#: ./src/pyams_security/interfaces/__init__.py:609
 msgid "The plug-in can be used to extract principals information"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:678
-msgid "Provider name"
-msgstr ""
-
-#: ./src/pyams_security/interfaces/__init__.py:682
-msgid "Provider ID"
-msgstr ""
-
 #: ./src/pyams_security/interfaces/__init__.py:683
+msgid "Provider name"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/__init__.py:687
+msgid "Provider ID"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/__init__.py:688
 msgid "This value should be unique between all providers"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:687
+#: ./src/pyams_security/interfaces/__init__.py:692
 msgid "Provider consumer key"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:690
+#: ./src/pyams_security/interfaces/__init__.py:695
 msgid "Provider secret"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:708
+#: ./src/pyams_security/interfaces/__init__.py:713
 msgid "Inherit parent security?"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:709
-msgid "Get access control entries (ACE) inherited from parent levels"
-msgstr ""
-
 #: ./src/pyams_security/interfaces/__init__.py:714
-msgid "Public permissions"
+msgid "Get access control entries (ACE) inherited from parent levels"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/__init__.py:719
+msgid "Public denied permissions"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:715
+#: ./src/pyams_security/interfaces/__init__.py:720
+msgid ""
+"These permissions will be denied to all users. Denied permissions take "
+"precedence over granted ones."
+msgstr ""
+
+#: ./src/pyams_security/interfaces/__init__.py:725
+msgid "Public granted permissions"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/__init__.py:726
 msgid "These permissions will be granted to all users"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:718
-msgid "Authenticated permissions"
+#: ./src/pyams_security/interfaces/__init__.py:729
+msgid "Authenticated denied permissions"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:719
+#: ./src/pyams_security/interfaces/__init__.py:730
+msgid ""
+"These permissions will be denied to authenticated users. Denied permissions "
+"take precedence over granted ones."
+msgstr ""
+
+#: ./src/pyams_security/interfaces/__init__.py:735
+msgid "Authenticated granted permissions"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/__init__.py:736
 msgid "These permissions will be granted to authenticated users"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:723
+#: ./src/pyams_security/interfaces/__init__.py:740
 msgid "Inherit parent roles?"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:724
+#: ./src/pyams_security/interfaces/__init__.py:741
 msgid "Get roles granted on parent levels"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:341
+#: ./src/pyams_security/interfaces/__init__.py:346
 msgid "Your email address is not valid!"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:365
-#: ./src/pyams_security/interfaces/__init__.py:388
+#: ./src/pyams_security/interfaces/__init__.py:370
+#: ./src/pyams_security/interfaces/__init__.py:393
 msgid "You didn't confirmed your password correctly!"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:412
+#: ./src/pyams_security/interfaces/__init__.py:417
 msgid "Given email address is not valid!"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:565
+#: ./src/pyams_security/interfaces/__init__.py:570
 msgid "You can't activate social login without selecting a social users folder"
 msgstr ""
 
-#: ./src/pyams_security/interfaces/__init__.py:589
+#: ./src/pyams_security/interfaces/__init__.py:594
 msgid "You can't activate open registration without selecting a users folder"
 msgstr ""
 
@@ -866,6 +894,14 @@
 msgid "Notifications can't be enabled without mailer utility"
 msgstr ""
 
+#: ./src/pyams_security/interfaces/profile.py:33
+msgid "Profile's avatar"
+msgstr ""
+
+#: ./src/pyams_security/interfaces/profile.py:34
+msgid "This picture will be associated to your user profile"
+msgstr ""
+
 #: ./src/pyams_security/plugin/http.py:44
 msgid "HTTP Basic credentials"
 msgstr ""
--- a/src/pyams_security/utility.py	Thu Oct 08 09:31:45 2015 +0200
+++ b/src/pyams_security/utility.py	Thu Oct 08 09:39:15 2015 +0200
@@ -179,6 +179,13 @@
                     return principal
         return MissingPrincipal(id=principal_id)
 
+    def get_all_principals(self, principal_id):
+        principals = set()
+        if principal_id:
+            for plugin in self.get_directory_plugins():
+                principals.update(plugin.get_all_principals(principal_id))
+        return principals
+
     def find_principals(self, query):
         principals = set()
         for plugin in self.get_directory_plugins():
@@ -272,7 +279,7 @@
             manager = self._get_security_manager(request)
             if manager is not None:
                 principals |= set(manager.effective_principals(principal_id))
-        logger.debug('principals = {0}'.format(str(principals)))
+        logger.debug('principals = {0}'.format(str(sorted(principals))))
         return principals
 
     def remember(self, request, principal, **kw):