La désignation du délégué à la protection des données pour les unités de recherche avec la ligne de 𝚌𝚘𝚖𝚖𝚊𝚗𝚍𝚎

Pour pouvoir mettre un traitement en conformité, il faut d’abord que le responsable de traitement ait désigné officiellement son délégué à la protection des données (DPD). Pour cela, il faut donc au préalable avoir identifié le responsable de traitement. Ce qui, dans l’ESR, peut vite se révéler une tâche difficile du fait de la multiplicité des tutelles.

Mais une fois que l’on a trouvé de quel côté chercher, encore faut–t–il trouver à quelle porte toquer. Ce qui suit présente donc les recommandations actuelles pour désigner le DPD d’une UMR et comment trouver les informations de contact des DPD désignés. Et donne aussi l’occasion de montrer quelques commandes Unix (Linux, BSD,…) —bash en l’occurrence— utiles pour traiter des fichiers textes.

Identifier le DPD désigné pour les équipes de recherche

Le DPD est le représentant du responsable de traitement. Il a notamment pour mission de contrôler le respect de la réglementation applicable aux traitement de DCP. Le DPD dépend donc du RdT au sens de la réglementation.

Le RGPD définit en effet le RdT comme la personne physique ou morale, l’autorité publique, le service ou un autre organisme qui, seul ou conjointement avec d’autres, détermine les finalités et les moyens du traitement (RGPD art. 4 § 7). Le problème est ici que les UMR ont au moins deux tutelles et parfois plus1. Et donc autant de RdT et de DPD possibles.

Après l’entrée en vigueur du RGPD, la règle ou, plus exactement, la recommandation suivante2 fut donc communiquée aux DU des UMR CNRS. Pour les UMR, le RdT est le directeur ou la directrice d’unité (DU) et il est recommandé de désigner le DPD de son employeur. Donc si le DU est, par exemple, personnel de l’université, il lui faudra désigner —c’est pas automatique— le DPD de l’université. De même que, si le DU est personnel CNRS, il lui faudra désigner la DPD du CNRS.

En conséquence de quoi, si le changement de direction conduit à un changement d’employeur du DU, il conviendrait de changer de DPD aussi et donc de réaliser un transfert de registre. Ce qui, dans les faits, peut se révéler difficilement envisageable pour différentes raisons. Les changements d’employeur du DU ne conduisent donc généralement pas un changement de DPD.

Ces recommandations datent toutefois de 2017. Il semblerait que l’on se dirigerait maintenant vers une désignation du DPD de la tutelle à qui est en charge de la gestion de l’unité. Mais je ne dispose pas de plus d’information pour l’instant.

Toujours est–il que, dans le cas où il n’y a qu’une seule tutelle, c’est le chef de l’établissement qui est le RdT et c’est donc le DPD de l’établissement qui est compétent. À la différence des UMR, il n’est pas besoin ici de désignation.

Et, dans tous les cas —DU ou chef d’établissement—, après un changement de direction, le RdT est aussi responsable des traitements entamés lors des mandats de ses prédécesseurs. Sauf lorsque l’infraction engage la responsabilité personnelle de ces derniers bien évidement (faute séparable des fonctions).

De plus, lorsque plusieurs RdT déterminent conjointement les finalités et les moyens du traitement, ils sont responsables conjoints du traitement (RCT). C’est par exemple le cas d’un projet de recherche associant plusieurs équipes. Les RCT doivent alors définir de manière transparente, par accord entre eux, leurs obligations respectives aux fins d’assurer le respect des obligations que leur impose le RGPD. Ces obligations couvrent notamment la sécurité du traitement, l’information et l’exercice des droits des personnes, le recours à des sous–traitants,…

Comment trouver les informations de contact des DPD ?

Tout cela est bel et bien mais, une fois qu’on a identifié administrativement le DPD désigné, reste ensuite encore à l’identifier physiquement. Souvent, ils disposent d’une page web sur le site ou dans l’intranet. Mais, si vous ne la trouvez pas —ou s’il elle n’existe pas— tout n’est pas perdu car la liste des DPD enregistrés à la Cnil est disponible sur le site www.data.gouv.fr. Cette liste permettra de savoir si votre unité à déjà désigné un DPD et, dans le cas contraire, quels sont les DPD de vos tutelles ou trouver le délégué de votre établissement.

Ce qui suit vise aussi à donner un aperçu de que l’on peut faire avec bash pour traiter des fichiers textes sans avoir à quitter la konsole et, surtout, sans jamais avoir à utiliser cette engeance méphitique toute droit sortie des enfers que d’aucuns appellent « tableur » (horreur, malheur).

En effet, les environnements de type Unix proposent de nombreuses commandes pour des traitements de plein texte. C’est d’ailleurs un argument utilisé au début des années 1980 par AT&T dans ce message à caractère informatif dans lequel figurent rien de moins que Dennis Ritchie et surtout Brian Kernighan (dont il sera question plus loin) ainsi que Ken Thompson (dont il a été question ailleurs).

Commençons par télécharger le fichier. Pour cela, on peut, entre autres possibilités, utiliser la commande wget :

wget -v https://www.data.gouv.fr/fr/datasets/r/c5d02b42-1008-4406-83f5-3a81c8b936a3 -O /chemin/vers/le/répertoire/de/destination/opencnil-organismes-avec-dpo.csv 
# pareil mais avec la date du jour dans le nom de fichier
wget -v https://www.data.gouv.fr/fr/datasets/r/c5d02b42-1008-4406-83f5-3a81c8b936a3 -O "/chemin/vers/le/répertoire/de/destination/opencnil-organismes-avec-dpo--`date +"%Y-%m-%d"`.csv"

Les backsticks dans une chaîne de caractères entre double apostrophes permettent permettent d’évaluer la commande qu’ils entourent. En l’occurrence, la commande date +"%Y-%m-%d qui retourne la date actuelle au format année-mois-jour.

Notez la redirection (code 302) que wget gère automatiquement.

On aurait pu utiliser curl qui propose beaucoup plus d’options mais ce qui le rend aussi plus difficile d’utilisation. Il n’est de plus pas nécessairement installé.

# ¡ curl devient TRÈS bavard avec -v !
curl -v https://www.data.gouv.fr/fr/datasets/r/c5d02b42-1008-4406-83f5-3a81c8b936a3 -o /chemin/vers/le/répertoire/de/destination/opencnil-organismes-avec-dpo.csv 

On se positionne dans le répertoire où se trouve le fichier

#
# cd := change directory
#
cd /chemin/vers/le/répertoire/de/destination

Commençons par le nombre d’enregistrements

# wc := word count
# la commande wc compte les mots mais avec -l, elle compte le nombre de lignes
# 
wc -l opencnil-organismes-avec-dpo.csv
90566 opencnil-organismes-avec-dpo.csv

ainsi que l’entête du fichier

# la commande head affiche sur la sortie standard les -n premières lignes
head -n 2 opencnil-organismes-avec-dpo.csv
SIREN organisme désignant;Nom organisme désignant;Secteur activité organisme désignant;Code NAF organisme désignant;Adresse postale organisme désignant;Code postal organisme désignant;Ville organisme désignant;Pays organisme désignant;Type de DPO;Date de la désignation;SIREN organisme désigné;Nom organisme désigné;Secteur activité organisme désigné;Code NAF organisme désigné;Adresse postale organisme désigné;Code postal organisme désigné;Ville organisme désigné;Pays organisme désigné;Moyen contact DPO email;Moyen contact DPO url;Moyen contact DPO téléphone;Moyen contact DPO adresse postale;Moyen contact DPO code postal;Moyen contact DPO ville;Moyen contact DPO pays;Moyen contact DPO autre
110000122;COMMISSION NATIONALE DE L'INFORMATIQUE ET DES LIBERTES;O;8411Z;3 PL DE FONTENOY - UNESCO;75007;PARIS 7;FRANCE;Personne physique;25/05/2018;;;;;;;;;;https://www.cnil.fr/fr/webform/contactez-le-dpo-de-la-cnil;0153732222;Commission nationale de l'informatique et des libertés A l'attention du délégué à la protection des données 3 Place de Fontenoy;75007;PARIS;France;

et, enfin, la liste des champs :

head -n1 opencnil-organismes-avec-dpo.csv |tr ';' '\n'

La commande tr —t̲r̲anslate— permet de remplacer ou supprimer des caractères dans un flux de données.

SIREN organisme désignant
Nom organisme désignant
Secteur activité organisme désignant
Code NAF organisme désignant
Adresse postale organisme désignant
Code postal organisme désignant
Ville organisme désignant
Pays organisme désignant
Type de DPO
Date de la désignation
SIREN organisme désigné
Nom organisme désigné
Secteur activité organisme désigné
Code NAF organisme désigné
Adresse postale organisme désigné
Code postal organisme désigné
Ville organisme désigné
Pays organisme désigné
Moyen contact DPO email
Moyen contact DPO url
Moyen contact DPO téléphone
Moyen contact DPO adresse postale
Moyen contact DPO code postal
Moyen contact DPO ville
Moyen contact DPO pays
Moyen contact DPO autre

On peut aussi utiliser une boucle pour ajouter un nº d’ordre :

head -n 1 opencnil-organismes-avec-dpo.csv|awk -F';' '{for(i=1;i<=NF;i++){print i ": " $i }}'
1: SIREN organisme désignant
2: Nom organisme désignant
3: Secteur activité organisme désignant
4: Code NAF organisme désignant
5: Adresse postale organisme désignant
6: Code postal organisme désignant
7: Ville organisme désignant
8: Pays organisme désignant
9: Type de DPO
10: Date de la désignation
11: SIREN organisme désigné
12: Nom organisme désigné
13: Secteur activité organisme désigné
14: Code NAF organisme désigné
15: Adresse postale organisme désigné
16: Code postal organisme désigné
17: Ville organisme désigné
18: Pays organisme désigné
19: Moyen contact DPO email
20: Moyen contact DPO url
21: Moyen contact DPO téléphone
22: Moyen contact DPO adresse postale
23: Moyen contact DPO code postal
24: Moyen contact DPO ville
25: Moyen contact DPO pays
26: Moyen contact DPO autre

awk est un langage de script pour le traitement de fichier de données au format texte séparée par un délimiteur comme les fichiers .csv. Il a été conçu par Alfred A̲ho3, Peter W̲einberger et Brian K̲ernighan4 et a notamment inspiré Tcl , Perl, Lua ou encore R.

La commande peut être décomposée comme suit

  • head -n 1 sélectionne la première ligne
  • l’opérateur pipe | passe le résultat de la commande head -n 1 à awk
  • -F';' indique le séparateur des champs —ici, un point–virgule—
  • la boucle '{for(i=1;i<=NF;i++){print i ": " $i }}' itère sur les différents champs du fichier indexés par $i
  • et les affiche sur la sortie standard (print)

Nous aurions pu aussi utiliser une boucle bash :

(IFS=';' i=0; for col in $(head -n1 opencnil-organismes-avec-dpo.csv); do \
 5;echo "$i $col" ; 
  done)

ou encore

(while IFS= read -r line; do \
  IFS=';' v=($line); i=0; \
  for col in "${v[@]}"; do \
  i=$(expr $i + 1);echo "$i: $col"; \
done done < <(head -n1 opencnil-organismes-avec-dpo.csv))

qui affiche la même chose mais de façon un peu plus cryptique.

Le fichier compte donc 90 566 enregistrements et 26 champs séparés par “;” dont les noms figurent à la première ligne. ¡nobs!

Youpi. Maintenant que l’on connaît la composition du fichier, le S.A.F.A.R.I. peut commencer.

En parlant de S.A.F.A.R.I., on peut déjà noter que la Cnil est enregistrée…à la Cnil.

Pour trouver des occurrences dans un fichier, on peut entre autres utiliser la vénérable et indispensable commande grep. grep permet de rechercher des chaînes de caractère au moyen d’expressions régulières dans des fichiers textes. Par exemple, si on cherche la ligne du Ceraps, la commande

#
# g/re/p : recherche G̲lobale d'une expression régulière (R̲egular E̲xpression) puis affiche (P̲rint) le résultat
#
grep -Pi "centre.*recherche.*administrative" opencnil-organismes-avec-dpo.csv
;Centre d'Etudes et de Recherches Administratives  Politiques et Sociales;M;;Facult? des Sciences juridiques  - 1 Place Deliot;59024;LILLE;France;Personne physique;22/09/2018;;;;;;;;;dpd.demandes@cnrs.fr;;33383856426;Déléguée à la protection des Données du CNRS, 2 RUE JEAN ZAY;54519;VANDOEUVRE-LES-NANCY;France;

permet de chercher le motif “centre.*recherche.*administrative” dans le fichier et affiche la ligne correspondante.

Chose importante, grep recherche le motif sur toute la ligne et non dans un champ particulier à la différence de awk qui, comme on le verra plus loin, permet de choisir le champ où chercher. grep offre toutefois plus de possibilités comme l’option -P qui permet d’utiliser des expressions régulières Perl. L’option -i permet elle de faire des recherches sans distinction de casse.

On peut combiner grep avec awk pour extraire et formater le résultat

grep -Pi "centre.*recherche.*administrative" opencnil-organismes-avec-dpo.csv|awk -F';' '{split($22,s,",");print $2 "\nDPD   : " s[1] "\nadrese: " $19 "\nurl   : " $20 }'
  
Centre d'Etudes et de Recherches Administratives  Politiques et Sociales
DPD   : Déléguée à la protection des Données du CNRS
adrese: dpd.demandes@cnrs.fr
url   : 

$22 contient l’adresse (“Déléguée à la protection des Données du CNRS, 2 RUE JEAN ZAY;54519”) et la commande split permet de découper la chaîne pour extraire “Déléguée à la protection des Données du CNRS” avec s[1].

On peut aussi avoir une idée du nombre d’unités mixtes prises en charges par exemple par le SPD du CNRSpages intranet6

grep -Pi "dpd\.demandes@cnrs\.fr" opencnil-organismes-avec-dpo.csv|wc -l

589. Pas mal. Sachant que ça n’inclue pas les différentes composantes du CNRS (directions fonctionnelles, délégations,…). Il y a deux ans la même requête retournait 554…

On peut aussi essayer avec un DPD universitaire au hasard :

#
awk -F';' 'BEGIN{IGNORECASE=1}{if( $2~"Universit.? de Lille") print($19)}' opencnil-organismes-avec-dpo.csv
grep -Pi "dpo@univ-lille\.fr" opencnil-organismes-avec-dpo.csv|cut -d';' -f 2

# ou bien, en une seule passe
awk -F';' 'BEGIN{IGNORECASE=1}{if( $2~"Universit.? de Lille") print($19)}' opencnil-organismes-avec-dpo.csv | head -n 1| grep -f - opencnil-organismes-avec-dpo.csv | cut -d';' -f 2

if( $2~"Universit.? de Lille") n’affiche que les lignes correspondant au motif Universit.? de Lille dans le second champ. La commande cut permet de sélectionner des colonnes dans un fichier séparées par -d';'. -f 1,2… permet de sélectionner des colonnes et -f 1-3… permet de sélectionner un plage de colonnes. L’option -f - permet de passer une expression régulière à grep avec un pipe.

Évidemment, dans ce cas–là, les unités comme les ULR ne figurent pas dans le fichier et ne sont donc pas prises en compte.

Surtout, le problème est ici qu’une des adresses est mal renseignée comme on peut s’en apercevoir avec une recherche approximative avec tre-agrep

cut -d';' -f 19 opencnil-organismes-avec-dpo.csv |tre-agrep -s -3 -w dpo@univ-lille.fr|sort|uniq
0:dpo@univ-lille.fr
1:dpo@uni-lille.fr

tre-agrep utilise la distance de Levenstein pour trouver des chaînes similaires. sort|uniq permet d’affiche les valeurs distinctes.

Il vaut donc mieux utiliser l’expression régulière suivante pour retrouver tous les enregistrement

grep -Pi "dpo@univ?-lille\.fr" opencnil-organismes-avec-dpo.csv|cut -d';' -f 2

L’exemple précédent montre une difficulté courante lors de recherches de plein texte. Les chaînes de caractères recherchées présentent souvent de nombreuses variations qui ne sont pas faciles à anticiper ou à trouver ce qui peut conduire à laisser échapper certaines occurrences.

Autre chose importante pour des recherches de plein texte, même s’il est en UTF-8

# la commande iconv permet de convertir d'un encodage à l'autre
# dans ce cas on convertit d'UTF-8 en UTF-8
# pour tester la validité de l'encodage
# puis on affiche la valeur retournée : 
# 0 s'il n'y a pas eu d'erreur, une autre valeur sinon
iconv -f utf8 opencnil-organismes-avec-dpo.csv -t utf8 -o /dev/null; echo $?
#
# on peut aussi utiliser la commande  isutf8 du package moreutils 

le fichier semble avoir connu quelque soucis d’encodage comme en atteste la présence d’un nombre non négligeable “?” dans le fichier à la place de ce que l’on peut supposer être des diacritiques

# Note: il faut d'abord filtrer les colonnes car des "?" peuvent figurer dans des url
cut -d';' -f 2,17,22 opencnil-organismes-avec-dpo.csv |grep "\?" |wc -l

ainsi que la présence du caractère “�” (U+FFFD) —voir après— qui est le caractère de remplacement qu’une application peut substituer à un caractère inconnu (Standard Unicode — 5.22 U+FFFD Substitution in Conversion, p. 252). Ou bien encore l’enregistrement du « CENTRE MILE-DURKHEIM » (sic).

Non que les caractères hors ASCII–ISO/ICE-646 aient tous été oblitérés

grep -Po "[[:^ascii:]]" opencnil-organismes-avec-dpo.csv|sort|uniq |xargs echo -n
­    § © « ® ° ´ · » – — ‘ ’ “ ” • › ² ª á Á à À â  ä Ä ã à ç Ç é É è È ê Ê ë Ë í Ì î Î ï Ï ñ Ñ º ó Ó ò ô Ô ö Ö ø Ø œ Œ Š ß ™ ú ù û Û ü Ü ÿ Ÿ µ �

xargs echo -n affiche le résultat en supprimant les sauts à la ligne.

Les trois premiers caractères non–imprimables sont respectivement une césure (Soft hyphen), une espace sans chasse insécable (Zero width no-break) et une espace insécable (Space no-break space) comme la commande uniname du package uniutils permet de le voir

echo -e "­   "|uniname
character  byte       UTF-32   encoded as     glyph   name
        0          0  0000AD   C2 AD          ­      SOFT HYPHEN
        1          2  000020   20                     SPACE
        2          3  00FEFF   EF BB BF               ZERO WIDTH NO-BREAK SPACE
        3          6  000020   20                     SPACE
        4          7  0000A0   C2 A0                  NO-BREAK SPACE
        5          9  00000A   0A                     LINE FEED (LF)

La commande uniname permet notamment d’afficher le nom du caractère figurant dans le fichier UnicodeData.txt de l’UCD (Unicode Character Database).

Malheureusement, le secteur activité et le code NAF de l’organisme désignant ne sont pas vraiment exploitables pour des traitements plus généraux comme, par exemple, repérer toutes les équipes de recherche. Le code NAF est en effet généralement manquant pour ces dernières, ce qui n’est pas totalement surprenant puisque que, p. ex., les UMR n’ont pas de SIREN. Et le code NAF de l’organisme désigné est de plus manquant. Le secteur de l’organisme désigné transparaît toutefois dans la lettre —3e colonne—. Les UMR peuvent ainsi entre autres avoir la lettre M —Activités spécialisées, scientifiques et techniques, p. ex. pour les unités au SPD du CNRS— ou P —Enseignement pour les unités ayant p. ex. désigné un DPD— mais qui ne sont pas propres à l’ESR et peuvent même être attribuées à des personnes physiques.

On peut toutefois essayer de retrouver les EPSCP :

awk -F';' '{if( $4~ /^854/) print $0}' opencnil-organismes-avec-dpo.csv|sort -t ';' -k 2
# même chose 
awk -F';' '$4 ~ /^854/ {print $0}' opencnil-organismes-avec-dpo.csv|sort -t ';' -k 2

Comme indiqué précédemment, $4~"^854" permet de tester au moyen d’une expression régulière si la chaîne contenue dans $4 commence par “854” qui est le préfixe de la catégorie Enseignement supérieur et post-secondaire non supérieur dans la NAF. -t ';' -k 2 permet de trier par la deuxième colonne d’un fichier dont les champs sont séparés par -t.

La liste retournée est toutefois loin de ne contenir que des établissement d’enseignement. Et, pour les établissement de recherche (EPST et, plus généralement, EPA), le préfixe 72 s’avère trop imprécis. On peut essayer d’améliorer le résultat en rajoutant la conditions que le nom de l’organisme désignant contient “NATIONAL”

awk -F';' 'BEGIN{IGNORECASE=1} $4 ~ /^72/ && $2 ~ /[[:space:]]NATIONAL/ {print $2}' opencnil-organismes-avec-dpo.csv|sort
CENTRE NATIONAL DE LA RECHERCHE SCIENTIFIQUE
CENTRE NATIONAL D'ETUDES SPATIALES
GRAND EQUIPEMENT NATIONAL DE CALCUL INTENSIF
INSTITUT NATIONAL DE LA SANTE ET DE LA RECHERCHE MEDICALE
INSTITUT NATIONAL DE RECHERCHE EN INFORMATIQUE ET EN AUTOMATIQUE
INSTITUT NATIONAL DE RECHERCHE EN SCIENCES ET TECHNOLOGIES POUR L'ENVIRONNEMENT ET L'AGRICULTURE
INSTITUT NATIONAL DE RECHERCHE POUR L'AGRICULTURE L'ALIMENTATION ET L'ENVIRONNEMENT
INSTITUT NATIONAL DE RECHERCHES ARCHEOLOGIQUES PREVENTIVES
INSTITUT NATIONAL D'ETUDES DEMOGRAPHIQUES
INSTITUT NATIONAL D' HISTOIRE DE L'ART
INSTITUT NATIONAL RECHERCHE SECURITE
INSTITUT NATIONAL TRANSFUSION SANGUINE
RESEAU NATIONAL DE TELECOMMUNICATION POUR LA TECHNOLOGIE D ENSEIGNEMENT ET LA RECHERCHE

mais la liste est encore trop longue puisqu’elle inclue notamment RENATER qui est un GIP ou l’Institut national d’histoire de l’art qui est un EPSCP (je crois).

Pour des traitements plus poussés, il sera sans doute préférable d’utiliser autre chose. Mais comme ces exemples le montrent, les commandes bash (grep, tr, cut, awk,…) mais aussi sed, diff, comm,…sont très pratiques pour explorer ou fouiller des fichiers txt.

Ces commandes peuvent aussi se révéler utiles pour préparer des fichiers ou encore comprendre pourquoi un fichier csv ne peut être importé dans dans R ou autre et éventuellement adapter les arguments de la fonction ou corriger le fichier. Il est aussi possible de récupérer le résultat d’une commande directement dans R en utilisant la fonction pipe() :

dpdUniv <- read.table(
  co <- pipe(
      ## filtre la première ligne et toutes celles contenant "universit" dans la deuxième colonne
      "awk -F';' 'BEGIN{IGNORECASE=1} (NR==1) || ( $2~\"universit\") { print($0) }' opencnil-organismes-avec-dpo.csv"
    , open = 'r'
  )
  , sep=';'
  , quote = "" 
  , comment.char = ''
  , header = T
)
close(co)
  1. Le record étant —à ma connaissance— rien moins que neuf pour une UMR CNRS. []
  2. fruit de —de (très) longues— tractations []
  3. Par ailleurs co–auteur du fameux Dragon Book. []
  4. Co–auteur de K&R, premier livre sur le langage C, The C Programming Language avec Dennis Ritchie. Il est de plus crédité comme l’auteur du premier « Hello World ». []
  5. i++ []
  6. L’accès à ces pages nécessite un compte Janus. []

OpenEdition suggests that you cite this post as follows:
Thomas Soubiran (February 19, 2023). La désignation du délégué à la protection des données pour les unités de recherche avec la ligne de 𝚌𝚘𝚖𝚖𝚊𝚗𝚍𝚎. NUMA. Retrieved July 17, 2024 from https://doi.org/10.58079/sgp4


You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Search OpenEdition Search

You will be redirected to OpenEdition Search