vidjil issueshttps://gitlab.inria.fr/vidjil/vidjil/-/issues2023-11-06T17:48:57+01:00https://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/1114Login customisé2023-03-02T11:53:28+01:00Vidjil TeamLogin customiséApparament c'est pas évident... serait-ce possible de ne pas toucher à la BD mais uniquement changer le formulaire, pour avoir le controle dessus ?
http://nasko7.blogspot.fr/2011/09/web2py-tips-change-upload-folder.html
http://www.web2py...Apparament c'est pas évident... serait-ce possible de ne pas toucher à la BD mais uniquement changer le formulaire, pour avoir le controle dessus ?
http://nasko7.blogspot.fr/2011/09/web2py-tips-change-upload-folder.html
http://www.web2py.com/book/default/chapter/09#Customizing-Auth
***
@Duezhttps://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/4115Vue des utilisateurs ayant accès à mes données2022-05-12T11:42:48+02:00Mathieu GiraudVue des utilisateurs ayant accès à mes donnéesDemande de ~"LIL-Lille" : voir, à tout instant, quels utilisateurs ou groupes ont accès à leurs données.Demande de ~"LIL-Lille" : voir, à tout instant, quels utilisateurs ou groupes ont accès à leurs données.https://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/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/2572CrossDomain, web2py et login2021-03-10T19:57:22+01:00Mathieu GiraudCrossDomain, web2py et loginVu par @RyanHerb
Patcher web2py (puis pull request) ?
Voir #1113, #2525, #2571Vu par @RyanHerb
Patcher web2py (puis pull request) ?
Voir #1113, #2525, #2571Ryan HerbertRyan Herberthttps://gitlab.inria.fr/vidjil/vidjil/-/issues/4328Account creation: Retour dans le client si l'adresse mail est déjà utilisée2021-02-09T16:15:37+01:00Thonier FlorianAccount creation: Retour dans le client si l'adresse mail est déjà utiliséeJe viens de me faire avoir a tenter une création de compte d'un utilisateur existant déjà. Lorsque j'ai fait validé, je suis tombé sur l'affichage du dernier compte créé, et comme j'avais switché de fenêtre pour faire le mail, je ne m'e...Je viens de me faire avoir a tenter une création de compte d'un utilisateur existant déjà. Lorsque j'ai fait validé, je suis tombé sur l'affichage du dernier compte créé, et comme j'avais switché de fenêtre pour faire le mail, je ne m'en suis pas aperçu.
Il faudrait avoir le bouton de validation de création de compte grisé si l'ensemble des champs ne sont pas rempli ou si l'adresse mail est déjà utilisée. Pour cela, il faudrait avoir une requête vers le serveur pour savoir si elle est déjà présente dans la base de données.https://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/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/3744Avoir un bouton pour generer un mot de passe aléatoire2020-11-13T19:39:15+01:00Thonier FlorianAvoir un bouton pour generer un mot de passe aléatoireUne petite fonction simple à mettre en place, avec un bouton associé, et accessoirement une div pour l'afficher
Lors de la création de compte, j'ouvre généralement à côté une page qui génère des mot de passe suivant des critères de cara...Une petite fonction simple à mettre en place, avec un bouton associé, et accessoirement une div pour l'afficher
Lors de la création de compte, j'ouvre généralement à côté une page qui génère des mot de passe suivant des critères de caractères et de complexités. Je laisse pas défaut, je génère, copie, colle dans l'interface vidjil.
On pourrait imaginer une fonction similaire et simple qui génère le mot de passe, le colle dans le contenu des div, et/ou le copie en même temps dans le presse papier.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/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/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/2953My Account: accès à ses préférences2020-09-24T12:38:43+02:00Mathieu GiraudMy Account: accès à ses préférencesExtrait de #1682.
@magiraud: Les préférences du client (voir #1188) se règlent actuellment directement dans le client, dans le menu "settings", qui sera à retransformer / éventuellement transformer en page autonome...
@magiraud: Devrai...Extrait de #1682.
@magiraud: Les préférences du client (voir #1188) se règlent actuellment directement dans le client, dans le menu "settings", qui sera à retransformer / éventuellement transformer en page autonome...
@magiraud: Devrait donner accès à "mes préférences ?" #878https://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/2571Logout n'affiche pas de message2020-09-23T17:32:47+02:00Mathieu GiraudLogout n'affiche pas de messageVu par @RyanHerb, en lien avec #1113.Vu par @RyanHerb, en lien avec #1113.https://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 duez