vidjil issueshttps://gitlab.inria.fr/vidjil/vidjil/-/issues2020-07-01T11:22:58+02:00https://gitlab.inria.fr/vidjil/vidjil/-/issues/4391Effet nul du changement de permission sur un patient2020-07-01T11:22:58+02:00Thonier FlorianEffet nul du changement de permission sur un patientJ'ai un utilisateur qui a créé un patient sur son groupe perso avant de rejoindre finalement un groupe d'utilisateur commun à son équipe.
J'ai voulu changer les permissions sur ce patient pour ajouter le groupe commun (au moins en lect...J'ai un utilisateur qui a créé un patient sur son groupe perso avant de rejoindre finalement un groupe d'utilisateur commun à son équipe.
J'ai voulu changer les permissions sur ce patient pour ajouter le groupe commun (au moins en lecture). La procédure c'est bien passé, j'ai eu le bon retour du serveur (`access 'access' granted to GROUP`). Cependant, lorsque j'ouvre en impersonate d'un autre membre de ce groupe, je ne peux pas voir ce patient.
Au passage, dans la colonne groups de la page patient, je vois bien maintenant ce groupe apparaître (https://gitlab.inria.fr/vidjil/vidjil/-/issues/3174#note_358690).https://gitlab.inria.fr/vidjil/vidjil/-/issues/4372self.user non défini alors que l'utilisateur est loggé2020-06-23T11:03:26+02:00Mikaël Salsonself.user non défini alors que l'utilisateur est loggéOn a des erreurs serveur (en l'occurrence de @flothoni) quand il essaie d'accéder à [une URL](https://db.vidjil.org/vidjil/results_file/download?filename=079301.vdj.fa&results_file_id=79301), alors qu'il est bien connecté.
[L'erreur](ht...On a des erreurs serveur (en l'occurrence de @flothoni) quand il essaie d'accéder à [une URL](https://db.vidjil.org/vidjil/results_file/download?filename=079301.vdj.fa&results_file_id=79301), alors qu'il est bien connecté.
[L'erreur](https://db.vidjil.org/admin/default/ticket/vidjil/131.254.15.191.2020-06-23.10-21-33.239d60b6-68f2-42f5-b398-9e0f6ed1fa15) montre que `self.user` vaut `None`, ce qui est étonnant puisqu'il est bien loggé.
```
Traceback (most recent call last):
File "/usr/share/vidjil/server/web2py/gluon/restricted.py", line 219, in restricted
exec(ccode, environment)
File "/usr/share/vidjil/server/web2py/applications/vidjil/controllers/results_file.py", line 182, in <module>
File "/usr/share/vidjil/server/web2py/gluon/globals.py", line 421, in <lambda>
self._caller = lambda f: f()
File "/usr/share/vidjil/server/web2py/gluon/cache.py", line 645, in wrapped_f
rtn = func()
File "/usr/share/vidjil/server/web2py/applications/vidjil/controllers/results_file.py", line 120, in download
if auth.can_view_sample_set(sample_set_id) and not '..' in request.vars['filename']:
File "/usr/share/vidjil/server/web2py/applications/vidjil/models/VidjilAuth.py", line 466, in can_view_sample_set
perm = self.get_permission(PermissionEnum.read.value, 'sample_set', sample_set_id, user)\
File "/usr/share/vidjil/server/web2py/applications/vidjil/models/VidjilAuth.py", line 180, in get_permission
perm_groups = self.get_permission_groups(action, user)
File "/usr/share/vidjil/server/web2py/applications/vidjil/models/VidjilAuth.py", line 118, in get_permission_groups
user = self.user.id
AttributeError: 'NoneType' object has no attribute 'id'
```marc duezmarc duezhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/3669Impossible de modifier les permissions d'un groupe2020-02-11T18:19:59+01:00Mikaël SalsonImpossible de modifier les permissions d'un groupeDans la page des groupes, lorsque je clique sur une icône des permissions (la clé), une requête est envoyée au contrôleur `group/permissions` qui produit une erreur 404. Le contrôleur existe bien, en revanche il n'y a pas de vue `views/g...Dans la page des groupes, lorsque je clique sur une icône des permissions (la clé), une requête est envoyée au contrôleur `group/permissions` qui produit une erreur 404. Le contrôleur existe bien, en revanche il n'y a pas de vue `views/groups/permissions.html`. J'ignore si c'est cela qui produit l'erreur 404, mais il ne semble pas y avoir eu de modifications récentes dans `views/`.
@flothoni je vois que tu as attribué des permissions début décembre, est-ce que cela fonctionnait correctement ? Comment as-tu fait ? Est-ce que cela fonctionne toujours pour toi ?https://gitlab.inria.fr/vidjil/vidjil/-/issues/4563Ouvrir "My Account" lorsqu'on clique sur son nom2020-12-10T09:30:47+01:00Mathieu GiraudOuvrir "My Account" lorsqu'on clique sur son nomSuite à !833. Dépend de #4562.Suite à !833. Dépend de #4562.https://gitlab.inria.fr/vidjil/vidjil/-/issues/4507À la création d'un serveur, demander deux fois le mot de passe admin2020-10-06T09:24:48+02:00Mathieu GiraudÀ la création d'un serveur, demander deux fois le mot de passe adminSinon on peut se tromper et ensuite avoir à relancer un serveur ;)
cc @duezSinon on peut se tromper et ensuite avoir à relancer un serveur ;)
cc @duezhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/4076Require (or suggest) that a user changes its password on her first login2019-12-02T19:01:01+01:00Mathieu GiraudRequire (or suggest) that a user changes its password on her first loginWhen a user logs for a first time, she should be redirected to the "change password" screen, maybe with a "Welcome to Vidjil!" greeting message.
See also #3367.When a user logs for a first time, she should be redirected to the "change password" screen, maybe with a "Welcome to Vidjil!" greeting message.
See also #3367.https://gitlab.inria.fr/vidjil/vidjil/-/issues/1113Login ne met pas d'erreur si mauvais login/mot de passe2020-09-24T15:02:03+02:00Vidjil TeamLogin ne met pas d'erreur si mauvais login/mot de passe
***
@Duez
***
@Duezhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/1104http://app.vidjil.org/browser/lille pourrait remplir le champ de login par dé...2017-10-23T11:33:43+02:00Vidjil Teamhttp://app.vidjil.org/browser/lille pourrait remplir le champ de login par défaut***
@Duez***
@Duezhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/4668Authentification SSO / SAML2021-01-27T16:06:25+01:00Mathieu GiraudAuthentification SSO / SAMLEst-ce que cela ferait sens, en complément de LDAP #2062, de permettre une authentification via un fournisseur externe ?
cc @duezEst-ce que cela ferait sens, en complément de LDAP #2062, de permettre une authentification via un fournisseur externe ?
cc @duezhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/3367Authentification forte2021-11-05T09:11:55+01:00Mathieu GiraudAuthentification forteEn France, les recommandations sont généralement d'avoir une authentification basée sur la CPS (http://esante.gouv.fr/services/espace-cps/cartes-professionnelles-de-sante), mais ce n'est pas obligatoire.
Un minimum serait de mettre en p...En France, les recommandations sont généralement d'avoir une authentification basée sur la CPS (http://esante.gouv.fr/services/espace-cps/cartes-professionnelles-de-sante), mais ce n'est pas obligatoire.
Un minimum serait de mettre en place un 2FA ou quelque chose du genre.
cc @RyanHerbhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/4118Comment visualiser qu'un utilisateur est "désactivé" ?2023-11-06T17:48:57+01:00Thonier FlorianComment visualiser qu'un utilisateur est "désactivé" ?En faisant une extraction de la base pour voir les utilisateurs liés à un groupe, je m'aperçois que je n'ai pas de moyen de savoir si un utilisateur a été désactivé.
Il me semble en avoir déjà désactivé un de la liste. En plus, je vois ...En faisant une extraction de la base pour voir les utilisateurs liés à un groupe, je m'aperçois que je n'ai pas de moyen de savoir si un utilisateur a été désactivé.
Il me semble en avoir déjà désactivé un de la liste. En plus, je vois que cet utilisateur ne s'est pas connecté depuis 2018, donc ça semble correspondre à mon souvenir. Cependant, je ne retrouve pas de trace dans mes mails.
Une solution serait de voir si le mot de passe à été désactivé, depuis web2py, mais ce n'est pas non plus le plus simple.
La solution optimale serait d'avoir un attribut propre à l'utilisateur dans la base. On pourrait aussi limiter les accès directement depuis la valeur de cet attribut.https://gitlab.inria.fr/vidjil/vidjil/-/issues/2959Groupe public géré par web2py2018-01-08T09:54:07+01:00Mathieu GiraudGroupe public géré par web2pyNous gérons nous-même le groupe public.
Il y a aussi `everybody_group_id` dans `Auth` (et donc dans `VidjilAuth`), qui apparamment gère aussi `has_permission`. Je ne sais pas si cela vaudrait le coup ou pas de l'utiliser pour ne plus le...Nous gérons nous-même le groupe public.
Il y a aussi `everybody_group_id` dans `Auth` (et donc dans `VidjilAuth`), qui apparamment gère aussi `has_permission`. Je ne sais pas si cela vaudrait le coup ou pas de l'utiliser pour ne plus le faire de notre côté.
cc @RyanHerbhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/2747Organiser les sample_sets par projet pour accélérer les requêtes2020-09-23T17:32:47+02:00Ryan HerbertOrganiser les sample_sets par projet pour accélérer les requêtesActuellement on a un système qui est très flexible en termes de permissions et d'associations de samples à plusieurs sets, voire plusieurs groupes. Mais c'est aussi plutôt lent à cause du système de permissions que j'ai créé.
Avec la no...Actuellement on a un système qui est très flexible en termes de permissions et d'associations de samples à plusieurs sets, voire plusieurs groupes. Mais c'est aussi plutôt lent à cause du système de permissions que j'ai créé.
Avec la notion de hierarchie de groupes, on se retrouve avec des requêtes plutôt complexes pour déterminer si l'utilisateur a accès à un élément.
> Il faut chercher si l'utilisateur appartient à un groupe qui a la permission `access` ou à un groupe dont le parent a la permission `access`
Donc lister les sets d'un type particulier auxquels un utilisateur a accès revient au code suivant:
``` python
def vidjil_accessible_query(self, name, table, user_id=None):
"""
Returns a query with all accessible records for user_id or
the current logged in user
this method does not work on GAE because uses JOIN and IN
This is an adaptation of accessible_query that better fits
the current auth system with group associations
:param: name: The name of the query (eg. 'read')
:param: table: The table for accessibility
:param: user_id: ID of the user
Example:
Use as::
db(auth.vidjil_accessible_query('read', db.mytable, 1)).select(db.mytable.ALL)
"""
if not user_id:
user_id = self.user_id
db = self.db
if isinstance(table, str) and table in self.db.tables():
table = self.db[table]
elif isinstance(table, (Set, Query)):
# experimental: build a chained query for all tables
if isinstance(table, Set):
cquery = table.query
else:
cquery = table
tablenames = db._adapter.tables(cquery)
for tablename in tablenames:
cquery &= self.vidjil_accessible_query(name, tablename,
user_id=user_id)
return cquery
if not isinstance(table, str) and\
self.has_permission(name, table, 0, user_id):
return table.id > 0
membership = self.table_membership()
permission = self.table_permission()
perm_groups = self.get_permission_groups(name, user_id)
query = (table.id.belongs(
db(((membership.user_id == user_id) &
(membership.group_id.belongs(perm_groups)) &
(membership.group_id == permission.group_id) &
(permission.name == PermissionEnum.access.value) &
(permission.table_name == table)))._select(permission.record_id)) |
table.id.belongs(
db(((membership.user_id == user_id) &
(membership.group_id.belongs(perm_groups)) &
(membership.group_id == db.group_assoc.second_group_id) &
(db.group_assoc.first_group_id == permission.group_id) &
(permission.name == PermissionEnum.access.value) &
(permission.table_name == table)))._select(permission.record_id)))
if self.settings.everybody_group_id:
query |= table.id.belongs(
db(permission.group_id == self.settings.everybody_group_id)
(permission.name == name)
(permission.table_name == table)
._select(permission.record_id))
return query
```
Ce qui produit la requête SQL suivante:
```sql
SELECT `patient`.`id`, `patient`.`first_name`, `patient`.`last_name`, `patient`.`birth`, `patient`.`info`, `patient`.`id_label`, `patient`.`creator`, `patient`.`sample_set_id` FROM `patient`
WHERE (
(`patient`.`id` IN
(SELECT `auth_permission`.`record_id` FROM `auth_permission`, `auth_membership`
WHERE (
(
(
(
(`auth_membership`.`user_id` = 2)
AND (`auth_membership`.`group_id` IN (4))
)
AND (`auth_membership`.`group_id` = `auth_permission`.`group_id`)
) AND (`auth_permission`.`name` = 'access')
) AND (`auth_permission`.`table_name` = 'patient')
))
)
OR (`patient`.`id` IN
(SELECT `auth_permission`.`record_id` FROM `auth_permission`, `auth_membership`, `group_assoc`
WHERE (
(
(
(
(
(`auth_membership`.`user_id` = 2)
AND (`auth_membership`.`group_id` IN (4))
)
AND (`auth_membership`.`group_id` = `group_assoc`.`second_group_id`)
) AND (`group_assoc`.`first_group_id` = `auth_permission`.`group_id`)
) AND (`auth_permission`.`name` = 'access')
) AND (`auth_permission`.`table_name` = 'patient')
)
)
));
```
On a donc une requête composée de deux sous-requêtes chacune contenant un `IN` aussi long que le nombre de groupes auxquels l'utilisateur appartient, l'une avec un `join` et l'autre avec deux `join` (ici les joins sont implicites).
Et les autres primitives du model `VidjilAuth` sont composées de plusieurs `joins` et souvent plusieurs requêtes.
Avec une organisation par projet (avec une nouvelle table, et une clef étrangère dans la table `sample_set`) on pourrait se débarrasser complètement de la permission `access`, et par la même occasion on laisse tomber cette anbiguïté qu'on a avec les groupes de projets/hôpitaux et les groupes de rôles/permissions.
La requête "patient" deviendrait:
```python
def get_project_sets(type, project_id):
return db(
(db.sample_set.project_id == project_id) &
(db.sample_set.sample_type == type) &
(db[type].sample_set_id == db.sample_set.id)
).select(db[type].*)
```
Avec auparavant avoir vérifié que l'utilisateur ait accès à un groupe/rôle apparetenant au projet (2 joins sur relativement peu de données). Ce qui nous donne un total de 4 joins sur deux requêtes par rapport à un total de 3 joins répartis sur 3 requêtes, et on perd les `IN`
Il y a plusieurs autres endroits où des gains de jointures ou de requêtes seraient aussi envisageables (`get_permission(...)`, `can_view_sample_set(...)`, ...).
Ainsi que des endroits où les requêtes seraient plus complexes ?
J'aurais tendance à vouloir limiter les associations de samples à des sets du même projet car celà simplifierai certaines requêtes, comme l'autocompletiondes tags, et ainsi que celle des samples_sets à l'ajout d'un sample.
Ca éliminerait également l'impacte des grosses requêtes auxquelles nous les admins soumettons la BDD. Et donc on n'occuperait plus un (voire plus) de processus uwsgi pendant des durées prolongées (par exemple, plus d'une minute pour un compare patient).
Cette moification demanderait beaucoup de travail, donc ça ne serait pas pour tout de suite, mais je pense que celà réduirait le nombre de timeouts subis par nos utilisateurs. Celà demanderait peut-être plus d'analyse, de tests et de benchmarks.https://gitlab.inria.fr/vidjil/vidjil/-/issues/2575Doit on ajouter le créateur du groupe au groupe en question ?2017-12-19T08:47:20+01:00Ryan HerbertDoit on ajouter le créateur du groupe au groupe en question ?Lorsque l'on créé un groupe dans vidjil, l'utilisateur qui a créé le groupe est ajouté dans le groupe par défaut.
La plupart du temps ce n'est pas désiré, mais parfois c'est utile...Lorsque l'on créé un groupe dans vidjil, l'utilisateur qui a créé le groupe est ajouté dans le groupe par défaut.
La plupart du temps ce n'est pas désiré, mais parfois c'est utile...https://gitlab.inria.fr/vidjil/vidjil/-/issues/2106Les décorateurs web2py fonctionneraient-ils ?2023-03-02T10:06:28+01:00Ryan HerbertLes décorateurs web2py fonctionneraient-ils ?Web2py fournit des décorateurs de fonction, notamment:
```python
@auth.requires_login()
@auth.requires_membership('group name')
@auth.requires_permission('read','table name',record_id)
```
Ces décorateurs pourraient-ils fonctionner...Web2py fournit des décorateurs de fonction, notamment:
```python
@auth.requires_login()
@auth.requires_membership('group name')
@auth.requires_permission('read','table name',record_id)
```
Ces décorateurs pourraient-ils fonctionner correctement avec le browser ? Pour avoir essayé avec `requires_login()` la fonction renvoi un code 303 et une erreur cross-origin arrive dans le terminal. Donc ça n'a pas l'air évident, mais je pense que si nous arrivions à trouver une solution simple, on pourrait enlever les redirections manuelles et parfois économiser un niveau d'indentation.
@magiraud @mikael-shttps://gitlab.inria.fr/vidjil/vidjil/-/issues/5049À la perte de permissions, rediriger vers la page de login2022-07-01T11:40:13+02:00Mathieu GiraudÀ la perte de permissions, rediriger vers la page de login@duez : "des erreurs de perte de session" ?
@mikael-s : "c'est probablement juste au redémarrage des containers" ?
Donc peut-être un non-problème critique@duez : "des erreurs de perte de session" ?
@mikael-s : "c'est probablement juste au redémarrage des containers" ?
Donc peut-être un non-problème critiquemarc duezmarc duezhttps://gitlab.inria.fr/vidjil/vidjil/-/issues/4819Supprimer toutes les données d'un utilisateur2021-07-22T15:26:46+02:00Mikaël SalsonSupprimer toutes les données d'un utilisateurPour vdj#1170 il serait utile d'avoir un contrôleur qui permet de supprimer toutes les données d'un utilisateur (à partir du moment où elles ne sont pas partagées avec un autre compte).
Le compte utilisateur pourrait rester (tout en sup...Pour vdj#1170 il serait utile d'avoir un contrôleur qui permet de supprimer toutes les données d'un utilisateur (à partir du moment où elles ne sont pas partagées avec un autre compte).
Le compte utilisateur pourrait rester (tout en supprimant les infos identifiantes) mais ajouter un booléen pour savoir que le compte est désactivé.https://gitlab.inria.fr/vidjil/vidjil/-/issues/4525Récupérer par API des .vidjil ou .analysis sans être loggué2020-10-16T11:50:51+02:00Mathieu GiraudRécupérer par API des .vidjil ou .analysis sans être logguéÉvoqué avec @flothoni : pouvoir récupérer le dernier vidjil/analysis sur L4 ou autre sans être loggué
Servirait pour le tutorial, mais aussi pour remplacer certains `wget` sur L4 dans les tests.Évoqué avec @flothoni : pouvoir récupérer le dernier vidjil/analysis sur L4 ou autre sans être loggué
Servirait pour le tutorial, mais aussi pour remplacer certains `wget` sur L4 dans les tests.https://gitlab.inria.fr/vidjil/vidjil/-/issues/4351Auto-logguer Démo ?2020-06-16T11:29:47+02:00Mathieu GiraudAuto-logguer Démo ?
@flothoni : cela aiderait à la pub, montrer un bouton pour arriver à une analyse.
Mais on a du mal à gérer le ~"server-auth". Peut-être plus passer par des clients avec ~"client-api"
@flothoni : cela aiderait à la pub, montrer un bouton pour arriver à une analyse.
Mais on a du mal à gérer le ~"server-auth". Peut-être plus passer par des clients avec ~"client-api"https://gitlab.inria.fr/vidjil/vidjil/-/issues/4330Avoir une date de péremption d'un utilisateur dans un groupe2020-06-10T22:16:51+02:00Thonier FlorianAvoir une date de péremption d'un utilisateur dans un groupeIl peut arriver que certaines équipes connaissent d'avance une date théorique de fin de contrat d'un membre (un CDD, un Phd ou un stagiaire).
On pourrait imaginer qu'un compte puisse avoir une date d'expiration à la création. Dans ce ca...Il peut arriver que certaines équipes connaissent d'avance une date théorique de fin de contrat d'un membre (un CDD, un Phd ou un stagiaire).
On pourrait imaginer qu'un compte puisse avoir une date d'expiration à la création. Dans ce cas, on fait une fois par jours/semaine le tour des comptes et on prévient/suspend un compte.
La suspension aurait pour effet de changer le mot de passe par un autre, bloquant ainsi l'exploitation du compte.
Tel que je le vois, on pourrait ajouter un champs dans la table des utilisateurs avec une date. Celle-ci pourrait être instancier à la création si on la connaît, ou laissé à nulle, (ou repoussée en cas de demande). On pourrait aussi l'utiliser pour prévenir les utilisateurs à X jours avant de l'appliquer. A la date, on a une tâche cron qui s'occupe de faire la manip.
Il y a probablement un mécanisme mixte avec ma proposition de supprimer les séquences d'un utilisateur non connecté depuis XX mois.