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.