Files @ f734d107296e
Branch filter:

Location: kallithea/CONTRIBUTORS

Mads Kiilerich
auth: for default permissions, use existing explicit query result values instead of following dot references in ORM result objects

There has been reports of spurious crashes on resolving references like
.repository from Permissions:

File ".../kallithea/lib/auth.py", line 678, in __wrapper
if self.check_permissions(user):
File ".../kallithea/lib/auth.py", line 718, in check_permissions
return user.has_repository_permission_level(repo_name, self.required_perm)
File ".../kallithea/lib/auth.py", line 450, in has_repository_permission_level
actual_perm = self.permissions['repositories'].get(repo_name)
File ".../kallithea/lib/vcs/utils/lazy.py", line 41, in __get__
value = self._func(obj)
File ".../kallithea/lib/auth.py", line 442, in permissions
return self.__get_perms(user=self, cache=False)
File ".../kallithea/lib/auth.py", line 498, in __get_perms
return compute(user_id, user_is_admin)
File ".../kallithea/lib/auth.py", line 190, in _cached_perms_data
r_k = perm.UserRepoToPerm.repository.repo_name
File ".../sqlalchemy/orm/attributes.py", line 285, in __get__
return self.impl.get(instance_state(instance), dict_)
File ".../sqlalchemy/orm/attributes.py", line 721, in get
value = self.callable_(state, passive)
File ".../sqlalchemy/orm/strategies.py", line 710, in _load_for_state
% (orm_util.state_str(state), self.key)

sqlalchemy.orm.exc.DetachedInstanceError: Parent instance <UserRepoToPerm at ...> is not bound to a Session; lazy load operation of attribute 'repository' cannot proceed (Background on this error at: http://sqlalche.me/e/bhk3)

Permissions are cached between requests: SA result records are stored in in
beaker.cache.sql_cache_short and resued in following requests after the initial
session as been removed. References in Permission objects would usually give
lazy lookup ... but not outside the original session, where we would get an
error like this.

Permissions are indeed implemented/used incorrectly. That might explain a part
of the problem. Even if not fully explaining or fixing this problem, it is
still worth fixing:

Permissions are fetched from the database using Session().query with multiple
class/table names (joined together in way that happens to match the references
specified in the table definitions) - including Repository. The results are
thus "structs" with selected objects. If repositories always were retrieved
using this selected repository, everything would be fine. In some places, this
was what we did.

But in some places, the code happened to do what was more intuitive: just use
.repository and rely on "lazy" resolving. SA was not aware that this one
already was present in the result struct, and would try to fetch it again. Best
case, that could be inefficient. Worst case, it would fail as we see here.

Fix this by only querying from one table but use the "joinedload" option to
also fetch other referenced tables in the same select. (This might
inefficiently return the main record multiple times ... but that was already
the case with the previous approach.)

This change is thus doing multiple things with circular dependencies that can't
be split up in minor parts without taking detours:

The existing repository join like:
.join((Repository, UserGroupRepoToPerm.repository_id == Repository.repo_id))
is thus replaced by:
.options(joinedload(UserGroupRepoToPerm.repository))

Since we only are doing Session.query() on one table, the results will be of
that type instead of "structs" with multiple objects. If only querying for
UserRepoToPerm this means:
- perm.UserRepoToPerm.repository becomes perm.repository
- perm.Permission.permission_name looked at the explicitly queried Permission
in the result struct - instead it should look in the the dereferenced
repository as perm.permission.permission_name
List of contributors to Kallithea project:

    Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> 2014-2020
    Mads Kiilerich <mads@kiilerich.com> 2016-2020
    Dennis Fink <dennis.fink@c3l.lu> 2020
    Andrej Shadura <andrew@shadura.me> 2012 2014-2017 2019
    Étienne Gilli <etienne.gilli@gmail.com> 2015-2017 2019
    Allan Nordhøy <epost@anotheragency.no> 2017-2019
    ssantos <ssantos@web.de> 2018-2019
    Adi Kriegisch <adi@cg.tuwien.ac.at> 2019
    Danni Randeris <danniranderis@gmail.com> 2019
    Edmund Wong <ewong@crazy-cat.org> 2019
    Elizabeth Sherrock <lizzyd710@gmail.com> 2019
    Hüseyin Tunç <huseyin.tunc@bulutfon.com> 2019
    leela <53352@protonmail.com> 2019
    Manuel Jacob <me@manueljacob.de> 2019
    Mateusz Mendel <mendelm9@gmail.com> 2019
    Nathan <bonnemainsnathan@gmail.com> 2019
    Oleksandr Shtalinberg <o.shtalinberg@gmail.com> 2019
    Private <adamantine.sword@gmail.com> 2019
    THANOS SIOURDAKIS <siourdakisthanos@gmail.com> 2019
    Wolfgang Scherer <wolfgang.scherer@gmx.de> 2019
    Христо Станев <hstanev@gmail.com> 2019
    Dominik Ruf <dominikruf@gmail.com> 2012 2014-2018
    Michal Čihař <michal@cihar.com> 2014-2015 2018
    Branko Majic <branko@majic.rs> 2015 2018
    Chris Rule <crule@aegistg.com> 2018
    Jesús Sánchez <jsanchezfdz95@gmail.com> 2018
    Patrick Vane <patrick_vane@lowentry.com> 2018
    Pheng Heong Tan <phtan90@gmail.com> 2018
    Максим Якимчук <xpinovo@gmail.com> 2018
    Марс Ямбар <mjambarmeta@gmail.com> 2018
    Mads Kiilerich <madski@unity3d.com> 2012-2017
    Unity Technologies 2012-2017
    Søren Løvborg <sorenl@unity3d.com> 2015-2017
    Sam Jaques <sam.jaques@me.com> 2015 2017
    Asterios Dimitriou <steve@pci.gr> 2016-2017
    Alessandro Molina <alessandro.molina@axant.it> 2017
    Anton Schur <tonich.sh@gmail.com> 2017
    Ching-Chen Mao <mao@lins.fju.edu.tw> 2017
    Eivind Tagseth <eivindt@gmail.com> 2017
    FUJIWARA Katsunori <foozy@lares.dti.ne.jp> 2017
    Holger Schramm <info@schramm.by> 2017
    Karl Goetz <karl@kgoetz.id.au> 2017
    Lars Kruse <devel@sumpfralle.de> 2017
    Marko Semet <markosemet@googlemail.com> 2017
    Viktar Vauchkevich <victorenator@gmail.com> 2017
    Takumi IINO <trot.thunder@gmail.com> 2012-2016
    Jan Heylen <heyleke@gmail.com> 2015-2016
    Robert Martinez <ntttq@inboxen.org> 2015-2016
    Robert Rauch <mail@robertrauch.de> 2015-2016
    Angel Ezquerra <angel.ezquerra@gmail.com> 2016
    Anton Shestakov <av6@dwimlabs.net> 2016
    Brandon Jones <bjones14@gmail.com> 2016
    Kateryna Musina <kateryna@unity3d.com> 2016
    Konstantin Veretennicov <kveretennicov@gmail.com> 2016
    Oscar Curero <oscar@naiandei.net> 2016
    Robert James Dennington <tinytimrob@googlemail.com> 2016
    timeless@gmail.com 2016
    YFdyh000 <yfdyh000@gmail.com> 2016
    Aras Pranckevičius <aras@unity3d.com> 2012-2013 2015
    Sean Farley <sean.michael.farley@gmail.com> 2013-2015
    Bradley M. Kuhn <bkuhn@sfconservancy.org> 2014-2015
    Christian Oyarzun <oyarzun@gmail.com> 2014-2015
    Joseph Rivera <rivera.d.joseph@gmail.com> 2014-2015
    Anatoly Bubenkov <bubenkoff@gmail.com> 2015
    Andrew Bartlett <abartlet@catalyst.net.nz> 2015
    Balázs Úr <urbalazs@gmail.com> 2015
    Ben Finney <ben@benfinney.id.au> 2015
    Daniel Hobley <danielh@unity3d.com> 2015
    David Avigni <david.avigni@ankapi.com> 2015
    Denis Blanchette <dblanchette@coveo.com> 2015
    duanhongyi <duanhongyi@doopai.com> 2015
    EriCSN Chang <ericsning@gmail.com> 2015
    Grzegorz Krason <grzegorz.krason@gmail.com> 2015
    Jiří Suchan <yed@vanyli.net> 2015
    Kazunari Kobayashi <kobanari@nifty.com> 2015
    Kevin Bullock <kbullock@ringworld.org> 2015
    kobanari <kobanari@nifty.com> 2015
    Marc Abramowitz <marc@marc-abramowitz.com> 2015
    Marc Villetard <marc.villetard@gmail.com> 2015
    Matthias Zilk <matthias.zilk@gmail.com> 2015
    Michael Pohl <michael@mipapo.de> 2015
    Michael V. DePalatis <mike@depalatis.net> 2015
    Morten Skaaning <mortens@unity3d.com> 2015
    Nick High <nick@silverchip.org> 2015
    Niemand Jedermann <predatorix@web.de> 2015
    Peter Vitt <petervitt@web.de> 2015
    Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> 2015
    Tuux <tuxa@galaxie.eu.org> 2015
    Viktar Palstsiuk <vipals@gmail.com> 2015
    Ante Ilic <ante@unity3d.com> 2014
    Calinou <calinou@opmbx.org> 2014
    Daniel Anderson <daniel@dattrix.com> 2014
    Henrik Stuart <hg@hstuart.dk> 2014
    Ingo von Borstel <kallithea@planetmaker.de> 2014
    invision70 <invision70@gmail.com> 2014
    Jelmer Vernooij <jelmer@samba.org> 2014
    Jim Hague <jim.hague@acm.org> 2014
    Matt Fellows <kallithea@matt-fellows.me.uk> 2014
    Max Roman <max@choloclos.se> 2014
    Na'Tosha Bard <natosha@unity3d.com> 2014
    Rasmus Selsmark <rasmuss@unity3d.com> 2014
    SkryabinD <skryabind@gmail.com> 2014
    Tim Freund <tim@freunds.net> 2014
    Travis Burtrum <android@moparisthebest.com> 2014
    whosaysni <whosaysni@gmail.com> 2014
    Zoltan Gyarmati <mr.zoltan.gyarmati@gmail.com> 2014
    Marcin Kuźmiński <marcin@python-works.com> 2010-2013
    Nemcio <areczek01@gmail.com> 2012-2013
    xpol <xpolife@gmail.com> 2012-2013
    Andrey Mivrenik <myvrenik@gmail.com> 2013
    Aparkar <aparkar@icloud.com> 2013
    ArcheR <aleclitvinov1980@gmail.com> 2013
    Dennis Brakhane <brakhane@googlemail.com> 2013
    gnustavo <gustavo@gnustavo.com> 2013
    Grzegorz Rożniecki <xaerxess@gmail.com> 2013
    Ilya Beda <ir4y.ix@gmail.com> 2013
    ivlevdenis <ivlevdenis.ru@gmail.com> 2013
    Jonathan Sternberg <jonathansternberg@gmail.com> 2013
    Leonardo Carneiro <leonardo@unity3d.com> 2013
    Magnus Ericmats <magnus.ericmats@gmail.com> 2013
    Martin Vium <martinv@unity3d.com> 2013
    Mikhail Zholobov <legal90@gmail.com> 2013
    mokeev1995 <mokeev_andre@mail.ru> 2013
    Ruslan Bekenev <furyinbox@gmail.com> 2013
    shirou - しろう 2013
    Simon Lopez <simon.lopez@slopez.org> 2013
    softforwinxp <softforwinxp@gmail.com> 2013
    stephanj <info@stephan-jauernick.de> 2013
    Ton Plomp <tcplomp@gmail.com> 2013
    zhmylove <zhmylove@narod.ru> 2013
    こいんとす <tkondou@gmail.com> 2013
    Augusto Herrmann <augusto.herrmann@planejamento.gov.br> 2011-2012
    Augusto Herrmann <augusto.herrmann@gmail.com> 2012
    Dan Sheridan <djs@adelard.com> 2012
    Dies Koper <diesk@fast.au.fujitsu.com> 2012
    Erwin Kroon <e.kroon@smartmetersolutions.nl> 2012
    H Waldo G <gwaldo@gmail.com> 2012
    hppj <hppj@postmage.biz> 2012
    Indra Talip <indra.talip@gmail.com> 2012
    mikespook <mikespook@gmail.com> 2012
    nansenat16 <nansenat16@null.tw> 2012
    Nemcio <bogdan114@g.pl> 2012
    Philip Jameson <philip.j@hostdime.com> 2012
    Raoul Thill <raoul.thill@gmail.com> 2012
    Stefan Engel <mail@engel-stefan.de> 2012
    Tony Bussieres <t.bussieres@gmail.com> 2012
    Vincent Caron <vcaron@bearstech.com> 2012
    Vincent Duvert <vincent@duvert.net> 2012
    Vladislav Poluhin <nuklea@gmail.com> 2012
    Zachary Auclair <zach101@gmail.com> 2012
    Ankit Solanki <ankit.solanki@gmail.com> 2011
    Dmitri Kuznetsov 2011
    Jared Bunting <jared.bunting@peachjean.com> 2011
    Jason Harris <jason@jasonfharris.com> 2011
    Les Peabody <lpeabody@gmail.com> 2011
    Liad Shani <liadff@gmail.com> 2011
    Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it> 2011
    Matt Zuba <matt.zuba@goodwillaz.org> 2011
    Nicolas VINOT <aeris@imirhil.fr> 2011
    Shawn K. O'Shea <shawn@eth0.net> 2011
    Thayne Harbaugh <thayne@fusionio.com> 2011
    Łukasz Balcerzak <lukaszbalcerzak@gmail.com> 2010
    Andrew Kesterson <andrew@aklabs.net>
    cejones
    David A. Sjøen <david.sjoen@westcon.no>
    James Rhodes <jrhodes@redpointsoftware.com.au>
    Jonas Oberschweiber <jonas.oberschweiber@d-velop.de>
    larikale
    RhodeCode GmbH
    Sebastian Kreutzberger <sebastian@rhodecode.com>
    Steve Romanow <slestak989@gmail.com>
    SteveCohen
    Thomas <thomas@rhodecode.com>
    Thomas Waldmann <tw-public@gmx.de>