diff -r 8a2d3a7f62d1 -r c55606a5c4b0 server/repository.py --- a/server/repository.py Wed Feb 24 11:14:14 2010 +0100 +++ b/server/repository.py Wed Feb 24 11:20:13 2010 +0100 @@ -114,16 +114,27 @@ # not expected for this). So: don't do it, we pretend to ensure repository # consistency. # - # also, we must not use unsafe_execute since we want the delete permission - # to be checked when some existing relation is deleted + # XXX we don't want read permissions to be applied but we want delete + # permission to be checked + rschema = session.repo.schema.rschema(rtype) if card[0] in '1?': - rschema = session.repo.schema.rschema(rtype) if not rschema.inlined: # inlined relations will be implicitly deleted - session.execute('DELETE X %s Y WHERE X eid %%(x)s, NOT Y eid %%(y)s' % rtype, - {'x': eidfrom, 'y': eidto}, 'x') + rset = session.unsafe_execute('Any X,Y WHERE X %s Y, X eid %%(x)s, ' + 'NOT Y eid %%(y)s' % rtype, + {'x': eidfrom, 'y': eidto}, 'x') + if rset: + safe_delete_relation(session, rschema, *rset[0]) if card[1] in '1?': - session.execute('DELETE X %s Y WHERE NOT X eid %%(x)s, Y eid %%(y)s' % rtype, - {'x': eidfrom, 'y': eidto}, 'y') + rset = session.unsafe_execute('Any X,Y WHERE X %s Y, Y eid %%(y)s, ' + 'NOT X eid %%(x)s' % rtype, + {'x': eidfrom, 'y': eidto}, 'y') + if rset: + safe_delete_relation(session, rschema, *rset[0]) + +def safe_delete_relation(session, rschema, subject, object): + if not rschema.has_perm(session, 'delete', fromeid=subject, toeid=object): + raise Unauthorized() + session.repo.glob_delete_relation(session, subject, rschema.type, object) class Repository(object):