cubicweb #511810 security insertion pb w/ unrelated_rql while creating entities [resolved]

fcayre reported:

voici un patch que je te propose sur la stable de ce jour (c741061d5348) pour régler un problème discuté avec auc par jabber, que je vais tenter de te résumer ici.

diff -r c741061d5348 entity.py
--- a/entity.py Wed Oct 28 12:19:01 2009 +0100
+++ b/entity.py Wed Nov 04 15:13:57 2009 +0100
@@ -752,12 +752,12 @@
               securitycheck_args = {'fromeid': self.eid}
           else:
               securitycheck_args = {'toeid': self.eid}
+            insertsecurity = (rtype.has_local_role('add') and not
+                              rtype.has_perm(self.req, 'add',
**securitycheck_args))
       else:
           restriction = []
           args = {}
-            securitycheck_args = {}
-        insertsecurity = (rtype.has_local_role('add') and not
-                          rtype.has_perm(self.req, 'add',
**securitycheck_args))
+            insertsecurity = False
       constraints = rtype.rproperty(subjtype, objtype, 'constraints')

En gros, le symptôme c'est un vocabulaire vide dans un formulaire de création d'entité pour une relation (sujet ici), en apparence simple mais avec une RRQLExpression sur la permission 'add', RQLExpression qui porte essentiellement sur le sujet de la relation. Or dans ce cas le sujet est une entité qui n'a pas d'eid, donc ça ne marche pas, le rql généré est trop général (car l'eid de l'entité n'est pas -et ne peut pas l'être- ajouté dans la clause WHERE).

Dans mon exemple j'obtiens

 <empty resultset Any O,AA ORDERBY AA DESC WHERE
O is RugbySeason, O modification_date AA, (EXISTS(NOT EXISTS(A
home_team_group B, A is RugbyScoresheet, B is RugbyGroup))) OR (EXISTS(C
home_team_group D, D managed_by E, C is RugbyScoresheet, D is RugbyGroup)),
E eid %(F)s>

avec un schéma simplifié comme suit et pour un formulaire de création d'entité de type RugbyScoresheet :

class RugbyScoresheet(EntityType):
  season = SubjectRelation('RugbySeason', cardinality='1*')

no_related_group_yet = RRQLExpression('NOT EXISTS(S home_team_group G)', 'S')
related_group_managers_s = RRQLExpression('S home_team_group G, G managed_by U')

class season(RelationType):
  permissions = {
  'read':   ('managers', 'users', 'guests'),
  'add':    ('managers', no_related_group_yet, related_group_managers_s),
  'delete': ('managers', related_group_managers_s),
  }

J'imagine que le patch est un peu simpliste pour toi car il ne filtre pas assez les entités proposées dans le vocabulaire, mais je ne vois pas trop comment on pourrait faire autrement... je te laisse voir.

En terme de gestion des versions, j'ai appliqué ce patch chez moi pour l'instant, mais il va de soi que je voudrais travailler avec une "vraie" stable, surtout que je galère depuis un bail pour rattrapper le train, je voudrais pas le laisser repartir... Tiens-moi bien au jus donc.

priorityimportant
typebug
done in3.5.6
load0.500
load left0.000
closed by<not specified>