Anomalie #342
ouvertCaractères % dans les noms d'objets et = dans les noms de rôles
0%
Description
DIAGNOSTIC
La présence de % dans les noms de schémas, rôles ou tout autre objet susceptible d'apparaître dans une requête GRANT/REVOKE est incompatible avec l'usage de la fonction format de PostgreSQL utilisée par ASGARD (notamment) pour générer lesdites requêtes GRANT/REVOKE.
Provoque des erreurs du type :
CREATE SCHEMA "a_%test" ;
UPDATE z_asgard.gestion_schema_usr
SET lecteur = 'g_consult'
WHERE nom_schema = 'a_%test' ;
-- pas de problème, car il n'y avait pas encore de
-- lecteur, donc ce sont les droits par défaut qui
-- sont appliqués et ils ne nécessitent pas format
UPDATE z_asgard.gestion_schema_usr
SET lecteur = 'public'
WHERE nom_schema = 'a_%test' ;
ERREUR : ERREUR: TA0 > spécificateur de type « t » pour format() non reconnu DETAIL: HINT: Pour un unique "%" utilisez "%%". CONTEXT: fonction PL/pgsql z_asgard_admin.asgard_on_modify_gestion_schema_after(), ligne 751 à RAISE
La présence du caractère '=' dans un nom de rôle pose également problème, car les expressions régulières utilisées pour la lecteur des champs acl du catalogue donnent un sens particulier à ce signe. Il n'est pas certain que cela puisse provoquer des erreurs, mais ce n'est pas à exclure et il est également plausible que certaines transmissions de droits ne se fassent alors pas correctement. L'effet est en tout cas clairement visible avec la fonction asgard_diagnostic().
CREATE SCHEMA a_test ;
UPDATE z_asgard.gestion_schema_usr
SET lecteur = 'g_lec=teur'
WHERE nom_schema = 'a_test' ;
SELECT * FROM z_asgard_admin.asgard_diagnostic() ;
renvoie une anomalie "privilège TRIGGER supplémentaire pour le rôle g_lec=teur" visant le schéma a_test...
PISTES DE SOLUTION
Option 1 : blocage amont.
Ajouter aux event triggers asgard_on_alter_objet, asgard_on_create_objet, asgard_on_create_schema, asgard_on_alter_schema des tests pour vérifier l'absence du caractère "%" dans les noms des objets et "%" ou "=" dans les noms des rôles désignés comme propriétaires, et générer des erreurs le cas échéant.
Créer un event trigger sur GRANT/REVOKE et ALTER DEFAULT PRIVILEGES pour empêcher l'attribution de droits à des rôles avec % ou =.
Les fonctions qui prennent en charge le référencement devraient vérifier les noms des objets, du propriétaire et de tous les rôles qui ont des droits sur l'objet.
Option 2 : tester a posteriori.
Ajouter des tests d'erreurs dans les fonctions asgard_synthese_[...] permettrait de couvrir une bonne partie des cas. Il faudra identifier les (éventuels) cas d'usage de format (pour %) et des champs acl (pour =) dans d'autres circonstances.
Cela semble être le cas, mais il faudrait s'assurer que l'ADL sera toujours en mesure de corriger le nom problématique sans que cela ne porte à conséquence.
Mis à jour par Leslie Lemaire il y a environ 4 ans
Ajout d'un avertissement dans la v4.0 de la documentation (partie II.2.C).
ASGARD est permissif sur le nommage des objets et tolère les noms qui ne respectent pas la forme canonique des identifiants PostgreSQL (majuscules, caractères spéciaux, espaces, etc.).
À deux exceptions près :
RÈGLE. Ne jamais utiliser le caractère « = » dans les noms de rôles. Ne jamais utiliser le caractère « % » dans les noms d’objets, quelle que soit leur nature.
D’une manière générale, il reste conseillé d’éviter les caractères spéciaux et tout particulièrement les guillemets simples et doubles, ainsi que les antislashs.
Mis à jour par Leslie Lemaire il y a presque 4 ans
- Version cible changé de asgard--1.2.1 à asgard--1.3