Spaces:
No application file
No application file
Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +25 -0
- .gradio/certificate.pem +31 -0
- .gradio/flagged/dataset1.csv +61 -0
- README.md +2 -8
- RGPD/README.md +6 -0
- RGPD/Services de prévention et de santé au travail.pdf +3 -0
- RGPD/afnor_spec_2217_spsti_08-2023.pdf +0 -0
- RGPD/cnil-pia-3-fr-basesdeconnaissances.pdf +0 -0
- RGPD/cnil_guide_spst_0 (1).pdf +3 -0
- RGPD/guide_pratique_rgpd_-_delegues_a_la_protection_des_donnees.pdf +3 -0
- RGPD/registre_rgpd_basique.pdf +0 -0
- RGPD/rgpd.py +251 -0
- code_test.py +61 -0
- factorial.py +14 -0
- generated_code_20241109_123707.py +26 -0
- generated_code_20241110_105740.py +26 -0
- ldap_log.log +3 -0
- scan_results.log +35 -0
- templates/index.html +120 -0
- templates/index2.html +76 -0
- templates/index3.html +64 -0
- test.pdf +0 -0
- test.py +70 -0
- test2.py +150 -0
- test3.py +28 -0
- test4.py +27 -0
- test_code_gen.py +59 -0
- testgeminicode/bin/Activate.ps1 +247 -0
- testgeminicode/bin/activate +69 -0
- testgeminicode/bin/activate.csh +26 -0
- testgeminicode/bin/activate.fish +69 -0
- testgeminicode/bin/celery +8 -0
- testgeminicode/bin/dateparser-download +8 -0
- testgeminicode/bin/f2py +8 -0
- testgeminicode/bin/flask +8 -0
- testgeminicode/bin/normalizer +8 -0
- testgeminicode/bin/numpy-config +8 -0
- testgeminicode/bin/pip +8 -0
- testgeminicode/bin/pip3 +8 -0
- testgeminicode/bin/pip3.10 +8 -0
- testgeminicode/bin/pyrsa-decrypt +8 -0
- testgeminicode/bin/pyrsa-encrypt +8 -0
- testgeminicode/bin/pyrsa-keygen +8 -0
- testgeminicode/bin/pyrsa-priv2pub +8 -0
- testgeminicode/bin/pyrsa-sign +8 -0
- testgeminicode/bin/pyrsa-verify +8 -0
- testgeminicode/bin/python +3 -0
- testgeminicode/bin/python3 +3 -0
- testgeminicode/bin/python3.10 +3 -0
- testgeminicode/bin/scapy +8 -0
.gitattributes
CHANGED
@@ -33,3 +33,28 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
RGPD/Services[[:space:]]de[[:space:]]prévention[[:space:]]et[[:space:]]de[[:space:]]santé[[:space:]]au[[:space:]]travail.pdf filter=lfs diff=lfs merge=lfs -text
|
37 |
+
RGPD/cnil_guide_spst_0[[:space:]](1).pdf filter=lfs diff=lfs merge=lfs -text
|
38 |
+
RGPD/guide_pratique_rgpd_-_delegues_a_la_protection_des_donnees.pdf filter=lfs diff=lfs merge=lfs -text
|
39 |
+
testgeminicode/bin/python filter=lfs diff=lfs merge=lfs -text
|
40 |
+
testgeminicode/bin/python3 filter=lfs diff=lfs merge=lfs -text
|
41 |
+
testgeminicode/bin/python3.10 filter=lfs diff=lfs merge=lfs -text
|
42 |
+
testgeminicode/lib/python3.10/site-packages/PyPDF2/_codecs/__pycache__/adobe_glyphs.cpython-310.pyc filter=lfs diff=lfs merge=lfs -text
|
43 |
+
testgeminicode/lib/python3.10/site-packages/grpc/_cython/cygrpc.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
44 |
+
testgeminicode/lib/python3.10/site-packages/lxml/etree.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
45 |
+
testgeminicode/lib/python3.10/site-packages/lxml/objectify.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
46 |
+
testgeminicode/lib/python3.10/site-packages/numpy/_core/_multiarray_umath.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
47 |
+
testgeminicode/lib/python3.10/site-packages/numpy/_core/_simd.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
48 |
+
testgeminicode/lib/python3.10/site-packages/numpy/random/_generator.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
49 |
+
testgeminicode/lib/python3.10/site-packages/numpy.libs/libgfortran-040039e1-0352e75f.so.5.0.0 filter=lfs diff=lfs merge=lfs -text
|
50 |
+
testgeminicode/lib/python3.10/site-packages/numpy.libs/libscipy_openblas64_-ff651d7f.so filter=lfs diff=lfs merge=lfs -text
|
51 |
+
testgeminicode/lib/python3.10/site-packages/pandas/_libs/algos.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
52 |
+
testgeminicode/lib/python3.10/site-packages/pandas/_libs/groupby.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
53 |
+
testgeminicode/lib/python3.10/site-packages/pandas/_libs/hashtable.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
54 |
+
testgeminicode/lib/python3.10/site-packages/pandas/_libs/interval.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
55 |
+
testgeminicode/lib/python3.10/site-packages/pandas/_libs/join.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
56 |
+
testgeminicode/lib/python3.10/site-packages/pandas/_libs/tslibs/offsets.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
57 |
+
testgeminicode/lib/python3.10/site-packages/pydantic_core/_pydantic_core.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
58 |
+
testgeminicode/lib/python3.10/site-packages/regex/_regex.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
59 |
+
testgeminicode/lib/python3.10/site-packages/yara.cpython-310-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
|
60 |
+
testgeminicode/lib/python3.10/site-packages/yara_python.libs/libcrypto-c62021f9.so.1.1 filter=lfs diff=lfs merge=lfs -text
|
.gradio/certificate.pem
ADDED
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
-----BEGIN CERTIFICATE-----
|
2 |
+
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
|
3 |
+
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
|
4 |
+
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
|
5 |
+
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
|
6 |
+
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
|
7 |
+
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
|
8 |
+
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
|
9 |
+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
|
10 |
+
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
|
11 |
+
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
|
12 |
+
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
|
13 |
+
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
|
14 |
+
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
|
15 |
+
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
|
16 |
+
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
|
17 |
+
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
|
18 |
+
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
|
19 |
+
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
|
20 |
+
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
|
21 |
+
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
|
22 |
+
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
|
23 |
+
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
|
24 |
+
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
|
25 |
+
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
|
26 |
+
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
|
27 |
+
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
|
28 |
+
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
|
29 |
+
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
|
30 |
+
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
|
31 |
+
-----END CERTIFICATE-----
|
.gradio/flagged/dataset1.csv
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
message,Réponse de Gemini,timestamp
|
2 |
+
"L’information sur la prise en charge dans une structure de soins, contenue dans un traitement, est-elle une donnée de santé ?","Oui, l'information sur la prise en charge dans une structure de soins, contenue dans un traitement, est généralement considérée comme une **donnée de santé** au sens du RGPD.
|
3 |
+
|
4 |
+
**Pourquoi ?**
|
5 |
+
|
6 |
+
* **Lien direct avec la santé :** La prise en charge dans une structure de soins est intrinsèquement liée à la santé physique ou mentale d'une personne. Elle implique qu'une personne a eu besoin de soins médicaux, ce qui est une information relative à sa santé.
|
7 |
+
* **Informations potentiellement sensibles :** L'information sur la prise en charge peut révéler des informations sensibles sur la santé de la personne, telles que le type de soins reçus, le diagnostic, la durée du séjour, etc.
|
8 |
+
|
9 |
+
**Conséquences pour un SPSTI :**
|
10 |
+
|
11 |
+
Si un SPSTI traite des informations sur la prise en charge de salariés dans des structures de soins, il doit les traiter comme des données de santé et respecter les exigences du RGPD :
|
12 |
+
|
13 |
+
* **Base légale :** Avoir une base légale pour le traitement de ces données (obligation légale, consentement explicite, intérêt vital, etc.). Dans le cadre du suivi médical des salariés, l'obligation légale est souvent la base légale appropriée.
|
14 |
+
* **Finalité déterminée :** Définir précisément la finalité du traitement de ces données et s'y limiter.
|
15 |
+
* **Minimisation des données :** Collecter uniquement les informations strictement nécessaires pour la finalité du traitement.
|
16 |
+
* **Sécurité :** Mettre en place des mesures de sécurité appropriées pour protéger ces données.
|
17 |
+
* **Information des personnes concernées :** Informer les salariés sur la collecte et l'utilisation de ces données.
|
18 |
+
|
19 |
+
|
20 |
+
Il est important de noter que même si l'information sur la prise en charge ne précise pas le motif médical (diagnostic), elle reste une donnée de santé car elle révèle qu'une personne a eu besoin de soins. Le simple fait de savoir qu'une personne a été prise en charge dans une structure de soins est une information relative à sa santé.
|
21 |
+
",2024-11-30 10:25:24.698337
|
22 |
+
comment doivent être traités les téléphones personnels des salariés qui sont utilisés dans le cadre professionnel ?,"La question des téléphones personnels utilisés dans le cadre professionnel, souvent appelée BYOD (Bring Your Own Device), est complexe au regard du RGPD, notamment dans un SPSTI qui traite des données de santé. Il n'y a pas de solution unique, et l'approche doit être adaptée au contexte et aux risques.
|
23 |
+
|
24 |
+
Voici les principaux points à considérer :
|
25 |
+
|
26 |
+
**1. Encadrer l'utilisation des téléphones personnels :**
|
27 |
+
|
28 |
+
* **Politique BYOD :** Mettre en place une politique BYOD claire et précise qui définit les conditions d'utilisation des téléphones personnels dans le cadre professionnel. Cette politique doit aborder les aspects suivants :
|
29 |
+
* Les usages autorisés et interdits.
|
30 |
+
* Les mesures de sécurité à respecter.
|
31 |
+
* Les responsabilités de l'employeur et du salarié.
|
32 |
+
* Les conséquences en cas de non-respect de la politique.
|
33 |
+
* **Séparation des données professionnelles et personnelles :** Mettre en place des solutions pour séparer les données professionnelles et personnelles sur le téléphone (par exemple, profils professionnels, applications dédiées, conteneurs sécurisés). Ceci est particulièrement important pour les données de santé.
|
34 |
+
* **Accès aux données du SPSTI :** Limiter l'accès aux données du SPSTI depuis les téléphones personnels au strict nécessaire. Si possible, privilégier l'accès via une plateforme web sécurisée plutôt que le téléchargement de données sur le téléphone.
|
35 |
+
|
36 |
+
**2. Sécurité :**
|
37 |
+
|
38 |
+
* **Mots de passe :** Exiger l'utilisation de mots de passe forts et le verrouillage automatique des téléphones.
|
39 |
+
* **Chiffrement :** Encourager, voire imposer, le chiffrement des données sur le téléphone.
|
40 |
+
* **Logiciels de sécurité :** Exiger l'installation de logiciels antivirus et anti-malware.
|
41 |
+
* **Mises à jour :** S'assurer que les téléphones sont à jour avec les dernières mises à jour de sécurité.
|
42 |
+
* **Gestion des appareils perdus ou volés :** Mettre en place une procédure pour effacer les données professionnelles à distance en cas de perte ou de vol du téléphone.
|
43 |
+
|
44 |
+
**3. Aspects RGPD :**
|
45 |
+
|
46 |
+
* **Finalités :** Définir clairement les finalités du traitement des données sur les téléphones personnels.
|
47 |
+
* **Bases légales :** Identifier la base légale pour chaque traitement (obligation légale, consentement, intérêt légitime, etc.). Le consentement du salarié est souvent nécessaire pour l'utilisation de son téléphone personnel à des fins professionnelles.
|
48 |
+
* **Information des personnes concernées :** Informer les salariés sur la collecte et l'utilisation des données sur leurs téléphones personnels, ainsi que sur leurs droits.
|
49 |
+
* **Registre des activités de traitement :** Documenter les traitements de données effectués sur les téléphones personnels dans le registre des activités de traitement.
|
50 |
+
|
51 |
+
|
52 |
+
**Alternatives au BYOD :**
|
53 |
+
|
54 |
+
Si les risques liés au BYOD sont jugés trop importants, envisager des alternatives, telles que :
|
55 |
+
|
56 |
+
* **Fournir des téléphones professionnels :** Fournir aux salariés des téléphones professionnels dédiés à l'usage professionnel. Ceci permet un meilleur contrôle de la sécurité et de la confidentialité des données.
|
57 |
+
* **Virtualisation :** Utiliser des solutions de virtualisation pour créer un environnement de travail sécurisé et isolé sur le téléphone personnel.
|
58 |
+
|
59 |
+
|
60 |
+
En résumé, l'utilisation de téléphones personnels dans un SPSTI doit être soigneusement encadrée pour garantir la sécurité et la confidentialité des données de santé. La mise en place d'une politique BYOD, de mesures de sécurité et le respect des principes du RGPD sont essentiels. Si les risques sont jugés trop importants, envisager des alternatives au BYOD.
|
61 |
+
",2024-11-30 10:30:00.518063
|
README.md
CHANGED
@@ -1,12 +1,6 @@
|
|
1 |
---
|
2 |
title: RGPD
|
3 |
-
|
4 |
-
colorFrom: blue
|
5 |
-
colorTo: purple
|
6 |
sdk: gradio
|
7 |
-
sdk_version: 5.
|
8 |
-
app_file: app.py
|
9 |
-
pinned: false
|
10 |
---
|
11 |
-
|
12 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
1 |
---
|
2 |
title: RGPD
|
3 |
+
app_file: rgpd.py
|
|
|
|
|
4 |
sdk: gradio
|
5 |
+
sdk_version: 5.7.1
|
|
|
|
|
6 |
---
|
|
|
|
RGPD/README.md
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: RGPD
|
3 |
+
app_file: rgpd.py
|
4 |
+
sdk: gradio
|
5 |
+
sdk_version: 5.7.1
|
6 |
+
---
|
RGPD/Services de prévention et de santé au travail.pdf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:d5eff713c385fb94a319369204dabf1bebeb1b009d84dab116ba458a0c1b73f1
|
3 |
+
size 1619472
|
RGPD/afnor_spec_2217_spsti_08-2023.pdf
ADDED
Binary file (585 kB). View file
|
|
RGPD/cnil-pia-3-fr-basesdeconnaissances.pdf
ADDED
Binary file (1,000 kB). View file
|
|
RGPD/cnil_guide_spst_0 (1).pdf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:f501710d92ee8c3ad1ee01c4635daf2b762b9c86eb07bd272c13b111e24aa437
|
3 |
+
size 1341591
|
RGPD/guide_pratique_rgpd_-_delegues_a_la_protection_des_donnees.pdf
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:a109eb80dbedf415b092d297fa375a6941433b733b0f6bd63f9b16cf87f969da
|
3 |
+
size 1586593
|
RGPD/registre_rgpd_basique.pdf
ADDED
Binary file (378 kB). View file
|
|
RGPD/rgpd.py
ADDED
@@ -0,0 +1,251 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import time
|
3 |
+
import google.generativeai as genai
|
4 |
+
import gradio as gr
|
5 |
+
|
6 |
+
genai.configure(api_key="AIzaSyD1TJ82gJaI9fL239kdsk6d4t-oLL3G2PE")
|
7 |
+
|
8 |
+
def upload_to_gemini(path, mime_type=None):
|
9 |
+
"""Uploads the given file to Gemini.
|
10 |
+
|
11 |
+
See https://ai.google.dev/gemini-api/docs/prompting_with_media
|
12 |
+
"""
|
13 |
+
file = genai.upload_file(path, mime_type=mime_type)
|
14 |
+
print(f"Uploaded file '{file.display_name}' as: {file.uri}")
|
15 |
+
return file
|
16 |
+
|
17 |
+
def wait_for_files_active(files):
|
18 |
+
"""Waits for the given files to be active.
|
19 |
+
|
20 |
+
Some files uploaded to the Gemini API need to be processed before they can be
|
21 |
+
used as prompt inputs. The status can be seen by querying the file's "state"
|
22 |
+
field.
|
23 |
+
|
24 |
+
This implementation uses a simple blocking polling loop. Production code
|
25 |
+
should probably employ a more sophisticated approach.
|
26 |
+
"""
|
27 |
+
print("Waiting for file processing...")
|
28 |
+
for name in (file.name for file in files):
|
29 |
+
file = genai.get_file(name)
|
30 |
+
while file.state.name == "PROCESSING":
|
31 |
+
print(".", end="", flush=True)
|
32 |
+
time.sleep(10)
|
33 |
+
file = genai.get_file(name)
|
34 |
+
if file.state.name != "ACTIVE":
|
35 |
+
raise Exception(f"File {file.name} failed to process")
|
36 |
+
print("...all files ready")
|
37 |
+
print()
|
38 |
+
|
39 |
+
# Create the model
|
40 |
+
generation_config = {
|
41 |
+
"temperature": 0,
|
42 |
+
"top_p": 0.95,
|
43 |
+
"top_k": 40,
|
44 |
+
"max_output_tokens": 4000,
|
45 |
+
"response_mime_type": "text/plain",
|
46 |
+
}
|
47 |
+
|
48 |
+
model = genai.GenerativeModel(
|
49 |
+
model_name="gemini-1.5-pro",
|
50 |
+
generation_config=generation_config,
|
51 |
+
system_instruction="tu es un agent IA DPO (data protector officer) expert en RGPD et spécialisé en données de santé. tu dois répondre au question de façons la plus concise possible, en citant tes sources et tu dois posser des questions si la demande n'est pas assez précise.",
|
52 |
+
)
|
53 |
+
|
54 |
+
# TODO Make these files available on the local file system
|
55 |
+
# You may need to update the file paths
|
56 |
+
files = [
|
57 |
+
upload_to_gemini("afnor_spec_2217_spsti_08-2023.pdf", mime_type="application/pdf"),
|
58 |
+
upload_to_gemini("guide_pratique_rgpd_-_delegues_a_la_protection_des_donnees.pdf", mime_type="application/pdf"),
|
59 |
+
upload_to_gemini("Services de prévention et de santé au travail.pdf", mime_type="application/pdf"),
|
60 |
+
upload_to_gemini("cnil-pia-3-fr-basesdeconnaissances.pdf", mime_type="application/pdf"),
|
61 |
+
upload_to_gemini("registre_rgpd_basique.pdf", mime_type="application/pdf"),
|
62 |
+
]
|
63 |
+
|
64 |
+
# Some files have a processing delay. Wait for them to be ready.
|
65 |
+
wait_for_files_active(files)
|
66 |
+
|
67 |
+
chat_session = model.start_chat(
|
68 |
+
history=[
|
69 |
+
{
|
70 |
+
"role": "user",
|
71 |
+
"parts": [
|
72 |
+
files[0],
|
73 |
+
files[1],
|
74 |
+
files[2],
|
75 |
+
"Bonjour",
|
76 |
+
],
|
77 |
+
},
|
78 |
+
{
|
79 |
+
"role": "model",
|
80 |
+
"parts": [
|
81 |
+
"Bonjour.\n\nLe document que vous avez fourni est l'AFNOR SPEC 2217, un référentiel de certification pour les Services de Prévention et de Santé au Travail Interentreprises (SPSTI). Il décrit les exigences que les SPSTI doivent respecter pour être certifiés, notamment en matière de :\n\n* **Qualité et effectivité des services** : Le référentiel exige que les SPSTI fournissent des services de qualité et efficaces dans le cadre de l'offre socle de services.\n* **Organisation et continuité du service** : Les SPSTI doivent avoir une organisation et des procédures claires et efficaces pour assurer la continuité du service.\n* **Gestion financière et tarification** : Le référentiel exige une gestion financière saine et une tarification transparente.\n* **Conformité au RGPD** : Les SPSTI doivent se conformer au Règlement Général sur la Protection des Données (RGPD) pour le traitement des données personnelles.\n* **Interopérabilité et sécurité des systèmes d'information** : Les systèmes d'information des SPSTI doivent être interopérables et sécurisés.\n\nLe référentiel comprend également des exigences spécifiques aux trois missions des SPSTI : la prévention des risques professionnels, le suivi individuel de l'état de santé et la prévention de la désinsertion professionnelle.\n\nPour plus d'informations sur la conformité au RGPD, vous pouvez consulter le guide pratique de la CNIL pour les délégués à la protection des données (DPO) : [https://www.cnil.fr/fr/guide-pratique-rgpd-delegues-la-protection-des-donnees](https://www.cnil.fr/fr/guide-pratique-rgpd-delegues-la-protection-des-donnees)\n\nEt pour plus d'informations sur les SPSTI, vous pouvez consulter le dossier de l'INRS : [https://www.inrs.fr/demarche/services-sante-travail](https://www.inrs.fr/demarche/services-sante-travail)\n\n\nAvez-vous des questions spécifiques sur ce référentiel ou sur la manière dont il s'applique à votre situation ? Par exemple, souhaitez-vous que je détaille un point particulier concernant les données de santé ?\n",
|
82 |
+
],
|
83 |
+
},
|
84 |
+
{
|
85 |
+
"role": "user",
|
86 |
+
"parts": [
|
87 |
+
"quelle est ta spécialité ?",
|
88 |
+
],
|
89 |
+
},
|
90 |
+
{
|
91 |
+
"role": "model",
|
92 |
+
"parts": [
|
93 |
+
"Je suis un agent IA DPO expert en RGPD et spécialisé en données de santé. Cela signifie que je suis entraîné sur un large corpus de textes relatifs au RGPD et à son application, en particulier dans le contexte des données de santé. Je peux donc vous aider à comprendre les exigences du RGPD, à identifier les risques liés au traitement des données de santé et à mettre en place des mesures de protection appropriées.\n",
|
94 |
+
],
|
95 |
+
},
|
96 |
+
{
|
97 |
+
"role": "user",
|
98 |
+
"parts": [
|
99 |
+
"peux tu me lister les données sensibles pouvant faire partie de mon service et que je dois intégrer dans mon RGPD ?",
|
100 |
+
],
|
101 |
+
},
|
102 |
+
{
|
103 |
+
"role": "model",
|
104 |
+
"parts": [
|
105 |
+
"Pour lister précisément les données sensibles relevant du RGPD que vous traitez dans votre service, j'ai besoin de plus de contexte. Quel type de service proposez-vous ? \n\nCependant, je peux vous donner une liste générale des catégories de données sensibles selon le RGPD qui pourraient être concernées dans un service lié à la santé :\n\n* **Données relatives à la santé** : Il s'agit de la catégorie la plus évidente et la plus large. Elle inclut tout type d'information concernant la santé physique ou mentale d'une personne, passée, présente ou future. Exemples : diagnostics, traitements, résultats d'examens médicaux, informations génétiques, etc. Dans le cadre professionnel, cela peut inclure aussi les données d'accident du travail, de maladie professionnelle, d'aptitude au poste, etc.\n\n* **Données génétiques** : Ces données sont une sous-catégorie des données de santé, mais méritent une attention particulière. Elles se réfèrent aux données relatives aux caractéristiques génétiques héritées ou acquises d'une personne physique qui donnent des informations uniques sur la physiologie ou la santé de cette personne physique et qui résultent notamment d'une analyse d'une échantillon biologique de la personne physique en question.\n\n* **Données biométriques** : Lorsque ces données sont traitées aux fins d'identifier une personne physique de manière unique, elles sont considérées comme sensibles. Exemples : empreintes digitales, reconnaissance faciale, reconnaissance vocale, etc. L'utilisation de la biométrie pour le contrôle d'accès aux dossiers médicaux est un exemple courant dans le secteur de la santé.\n\n* **Données concernant la vie sexuelle ou l'orientation sexuelle** : Ces données sont très sensibles et leur traitement est en principe interdit, sauf exceptions limitativement énumérées par le RGPD. Dans le contexte de la santé, cela pourrait être pertinent dans certains cas très spécifiques, par exemple pour le suivi de certaines pathologies ou traitements.\n\n* **Données relatives à l'origine raciale ou ethnique** : Comme les données concernant la vie sexuelle, le traitement de ces données est en principe interdit, sauf exceptions. Dans le contexte de la santé, cela pourrait être pertinent pour des études médicales ou des recherches sur certaines maladies ayant une prévalence plus élevée dans certains groupes ethniques, mais un encadrement strict est nécessaire.\n\n* **Données relatives aux opinions politiques, aux convictions philosophiques ou religieuses, à l'appartenance syndicale** : Ces données sont moins susceptibles d'être traitées dans un service lié à la santé, mais il est important de les mentionner. Leur traitement est interdit, sauf exceptions.\n\n\nPour que je puisse vous donner une liste plus précise et pertinente, veuillez me fournir des informations sur le type de service que vous proposez. Êtes-vous un professionnel de santé ? Travaillez-vous dans un hôpital, une clinique, un laboratoire, une entreprise de biotechnologie, ou autre ? Quelles sont les activités principales de votre service ?\n",
|
106 |
+
],
|
107 |
+
},
|
108 |
+
{
|
109 |
+
"role": "user",
|
110 |
+
"parts": [
|
111 |
+
"mon service est un SPSTi (Service de Santé et de Prévention en santé au travail)",
|
112 |
+
],
|
113 |
+
},
|
114 |
+
{
|
115 |
+
"role": "model",
|
116 |
+
"parts": [
|
117 |
+
"Votre service étant un SPSTI, vous traitez des données de santé particulièrement sensibles. Voici une liste plus précise des données sensibles que vous devez prendre en compte dans le cadre du RGPD :\n\n* **Données médicales des salariés:** Diagnostics, traitements, résultats d'examens médicaux (biologiques, imagerie, etc.), comptes rendus de consultations, antécédents médicaux, fiches d'aptitude, informations sur les expositions professionnelles, dossiers médicaux en santé au travail (DMST), etc.\n\n* **Données relatives aux accidents du travail et aux maladies professionnelles :** Nature de l'accident ou de la maladie, circonstances, traitements, suivi médical, conséquences sur l'aptitude au travail, etc.\n\n* **Données génétiques :** Si vous réalisez des tests génétiques dans le cadre de la surveillance médicale des salariés exposés à certains risques, ces données sont particulièrement sensibles et nécessitent un encadrement très strict.\n\n* **Données biométriques :** Si vous utilisez des systèmes biométriques pour l'identification des salariés (par exemple, pour l'accès aux dossiers médicaux), ces données doivent être traitées avec une grande précaution.\n\n* **Données relatives à la vie sexuelle ou l'orientation sexuelle :** Dans des cas très spécifiques et limités, vous pourriez être amené à traiter ce type de données, par exemple dans le cadre du suivi de certaines pathologies. Il est crucial de respecter les bases légales de traitement et les principes de minimisation et de limitation des finalités.\n\n* **Données relatives à l'origine raciale ou ethnique :** Dans le cadre d'études épidémiologiques ou de recherches médicales, vous pourriez être amené à traiter ce type de données. Là encore, le respect des bases légales et des principes du RGPD est essentiel.\n\n* **Données relatives aux opinions politiques, aux convictions philosophiques ou religieuses, à l'appartenance syndicale :** Le traitement de ces données est très encadré et en principe interdit dans le cadre d'un SPSTI, sauf exceptions très limitées.\n\n\n**Points importants à considérer :**\n\n* **Base légale :** Assurez-vous d'avoir une base légale solide pour chaque traitement de données sensibles. Dans le cadre d'un SPSTI, la base légale la plus courante est l'obligation légale (Code du travail) et le consentement explicite pour les traitements non obligatoires.\n\n* **Principes du RGPD :** Appliquez les principes de minimisation, de limitation des finalités, de sécurité, etc. à tous les traitements de données sensibles.\n\n* **Mesures de sécurité :** Mettez en place des mesures de sécurité techniques et organisationnelles robustes pour protéger les données sensibles contre tout accès non autorisé, toute divulgation, toute altération ou toute destruction.\n\n* **Information des personnes concernées :** Informez clairement les salariés sur les données sensibles que vous collectez, les finalités du traitement, les destinataires, leurs droits, etc.\n\n* **DPO :** Désignez un Délégué à la Protection des Données (DPO) si nécessaire. Vu la nature des données traitées par un SPSTI, la désignation d'un DPO est fortement recommandée, voire obligatoire selon les critères de la CNIL.\n\n* **Registre des activités de traitement :** Documentez tous les traitements de données sensibles dans votre registre des activités de traitement.\n\n\nN'hésitez pas à me poser d'autres questions si vous souhaitez approfondir un point particulier.\n",
|
118 |
+
],
|
119 |
+
},
|
120 |
+
{
|
121 |
+
"role": "user",
|
122 |
+
"parts": [
|
123 |
+
"qui peut être DPO dans un SPSTI ?",
|
124 |
+
],
|
125 |
+
},
|
126 |
+
{
|
127 |
+
"role": "model",
|
128 |
+
"parts": [
|
129 |
+
"La désignation d'un DPO pour un SPSTI suit les mêmes règles générales que pour toute autre organisation. Le RGPD ne définit pas de profil type, mais insiste sur les compétences et l'absence de conflit d'intérêts. \n\n**Compétences requises :**\n\n* **Expertise en matière de protection des données :** Connaissance approfondie du RGPD, de la Loi Informatique et Libertés et des autres réglementations applicables.\n* **Connaissance du secteur de la santé au travail :** Compréhension des enjeux spécifiques liés à la santé et à la sécurité au travail, des obligations des SPSTI et du contexte réglementaire.\n* **Compétences techniques :** Capacité à comprendre les systèmes d'information, les mesures de sécurité et les risques liés aux traitements de données.\n* **Qualités personnelles :** Intégrité, rigueur, capacité d'analyse, sens de la communication, diplomatie, autonomie.\n\n\n**Absence de conflit d'intérêts :**\n\nLe DPO ne doit pas occuper de fonction au sein du SPSTI qui le conduirait à déterminer les finalités et les moyens des traitements de données dont il a la charge de contrôler. Exemples de fonctions incompatibles : directeur, médecin chef, responsable du système d'information, responsable des ressources humaines. Un médecin du travail peut être DPO à condition de ne pas avoir de rôle décisionnel dans la détermination des finalités et des moyens des traitements.\n\n**Qui peut être DPO dans un SPSTI ?**\n\n* **Un membre du personnel :** Un salarié du SPSTI peut être désigné DPO, à temps plein ou à temps partiel, à condition qu'il possède les compétences requises et qu'il n'y ait pas de conflit d'intérêts.\n* **Un prestataire externe :** Le SPSTI peut faire appel à un DPO externalisé, ce qui peut être une solution avantageuse, notamment pour les petits SPSTI qui n'ont pas les ressources internes suffisantes. Dans ce cas, un contrat de service doit être établi.\n* **Un DPO mutualisé :** Plusieurs SPSTI peuvent se regrouper pour désigner un DPO commun, ce qui permet de mutualiser les coûts et les compétences. Une convention de mutualisation doit être établie entre les SPSTI.\n\n\n**Points importants :**\n\n* **Formation :** Même si aucune certification n'est obligatoire, il est fortement recommandé que le DPO suive une formation spécialisée en protection des données, en particulier dans le secteur de la santé. La CNIL propose des formations et des certifications pour les DPO.\n* **Ressources :** Le SPSTI doit fournir au DPO les ressources nécessaires pour exercer ses missions : temps, budget, accès à l'information, support de la direction.\n* **Désignation auprès de la CNIL :** Le SPSTI doit désigner son DPO auprès de la CNIL via le formulaire en ligne.\n\n\nIl est important de documenter la désignation du DPO et les raisons pour lesquelles la personne choisie remplit les conditions requises, notamment en termes de compétences et d'absence de conflit d'intérêts. Ce document servira de preuve en cas de contrôle de la CNIL.\n",
|
130 |
+
],
|
131 |
+
},
|
132 |
+
{
|
133 |
+
"role": "user",
|
134 |
+
"parts": [
|
135 |
+
"dans le cas d'un DPO externe, comment et avec qui doit il travailler au sein du SPSTI ?",
|
136 |
+
],
|
137 |
+
},
|
138 |
+
{
|
139 |
+
"role": "model",
|
140 |
+
"parts": [
|
141 |
+
"Un DPO externe, bien qu'il ne soit pas un employé du SPSTI, doit interagir avec différents acteurs et services pour mener à bien ses missions. Voici les points clés de la collaboration :\n\n**Avec la direction :**\n\n* **Rapport direct :** Le DPO doit avoir un accès direct à la direction du SPSTI (directeur, président, etc.) pour lui faire part de ses analyses, conseils et recommandations. Cet accès direct est essentiel pour garantir son indépendance et l'efficacité de son action.\n* **Points réguliers :** Des réunions régulières doivent être organisées avec la direction pour discuter des questions de protection des données, des risques identifiés et des actions à mettre en œuvre.\n\n**Avec l'équipe pluridisciplinaire (médecins du travail, IPRP, infirmiers, etc.) :**\n\n* **Collaboration étroite :** Le DPO doit travailler en étroite collaboration avec l'équipe pluridisciplinaire pour les sensibiliser aux enjeux du RGPD, les conseiller sur les bonnes pratiques et les accompagner dans la mise en conformité des traitements de données.\n* **Formation et support :** Le DPO peut organiser des formations et fournir un support aux membres de l'équipe pluridisciplinaire sur les aspects pratiques du RGPD.\n\n**Avec le service informatique :**\n\n* **Échange d'informations :** Le DPO doit échanger régulièrement avec le service informatique sur les mesures de sécurité mises en place, les risques liés aux systèmes d'information et les solutions pour garantir la confidentialité, l'intégrité et la disponibilité des données.\n* **Collaboration sur les projets :** Le DPO doit être impliqué dans les projets informatiques qui ont un impact sur la protection des données, dès la phase de conception (privacy by design).\n\n**Avec les salariés et les représentants du personnel :**\n\n* **Point de contact :** Le DPO est le point de contact pour les salariés et les représentants du personnel sur toutes les questions relatives à la protection des données. Il doit être facilement joignable et répondre à leurs demandes d'information et d'exercice de leurs droits.\n* **Sensibilisation et formation :** Le DPO peut organiser des sessions de sensibilisation et de formation pour les salariés sur les enjeux du RGPD et les bonnes pratiques en matière de protection des données.\n\n**Avec le service en charge du registre des activités de traitement :**\n\n* **Accès au registre :** Le DPO doit avoir accès au registre des activités de traitement pour pouvoir exercer ses missions de contrôle et de conseil. Il peut également être impliqué dans la mise à jour du registre.\n\n**Formalisation de la collaboration :**\n\nIl est important de formaliser les modalités de collaboration entre le DPO externe et le SPSTI dans un contrat de service ou une lettre de mission. Ce document doit préciser :\n\n* Les missions du DPO\n* Ses responsabilités\n* Ses interlocuteurs privilégiés\n* Les ressources mises à sa disposition\n* Les modalités de communication\n* La fréquence des réunions\n\n\nEn résumé, le DPO externe, bien qu'extérieur à la structure, doit être intégré au fonctionnement du SPSTI et travailler en étroite collaboration avec les différents acteurs et services pour assurer une protection efficace des données de santé.\n",
|
142 |
+
],
|
143 |
+
},
|
144 |
+
{
|
145 |
+
"role": "user",
|
146 |
+
"parts": [
|
147 |
+
"cites tes sources",
|
148 |
+
],
|
149 |
+
},
|
150 |
+
{
|
151 |
+
"role": "model",
|
152 |
+
"parts": [
|
153 |
+
"Mes sources d'information sont variées et dépendent du type de requête. Pour les informations légales et réglementaires, je m'appuie principalement sur :\n\n* **Le Règlement Général sur la Protection des Données (RGPD) :** Texte de référence en matière de protection des données personnelles en Europe. Disponible sur le site web de la Commission européenne : [https://eur-lex.europa.eu/eli/reg/2016/679/oj](https://eur-lex.europa.eu/eli/reg/2016/679/oj)\n* **La Loi Informatique et Libertés :** Loi française qui transpose et complète le RGPD. Disponible sur Légifrance : [https://www.legifrance.gouv.fr/](https://www.legifrance.gouv.fr/)\n* **Le site web de la CNIL (Commission Nationale de l'Informatique et des Libertés) :** Source d'information essentielle sur le RGPD et la Loi Informatique et Libertés, avec des guides pratiques, des fiches thématiques, des actualités, etc. : [https://www.cnil.fr/](https://www.cnil.fr/)\n* **Le site web du CEPD (Comité Européen de la Protection des Données) :** Organe consultatif indépendant qui émet des avis et des recommandations sur la protection des données. : [https://edpb.europa.eu/edpb_fr](https://edpb.europa.eu/edpb_fr)\n* **Légifrance :** Site web officiel pour consulter les lois et les règlements français.\n\nPour les informations plus spécifiques sur les SPSTI et la santé au travail, je me réfère à :\n\n* **Le Code du travail :**",
|
154 |
+
],
|
155 |
+
},
|
156 |
+
{
|
157 |
+
"role": "user",
|
158 |
+
"parts": [
|
159 |
+
files[3],
|
160 |
+
"voici un document supplémentaire sur lequel t'appuyer pour me répondre",
|
161 |
+
],
|
162 |
+
},
|
163 |
+
{
|
164 |
+
"role": "model",
|
165 |
+
"parts": [
|
166 |
+
"Merci pour ce document. Il s'agit du guide de la CNIL sur les analyses d'impact relatives à la protection des données (PIA). Il est très utile pour comprendre les risques liés à un traitement de données et pour choisir les mesures de protection appropriées.\n\nEn complément de mes réponses précédentes et en m'appuyant sur ce document, je peux vous donner des informations plus précises sur la façon dont un DPO externe doit travailler au sein d'un SPSTI, notamment en ce qui concerne les PIA.\n\n**Rôle du DPO externe dans les PIA d'un SPSTI :**\n\n* **Conseil et accompagnement :** Le DPO doit conseiller le SPSTI sur la nécessité de réaliser une PIA pour un traitement donné. Il doit l'aider à identifier les risques pour les droits et libertés des personnes concernées et à choisir les mesures de protection appropriées. Le guide de la CNIL fournit une méthodologie et des exemples de mesures qui peuvent être utilisés dans ce cadre.\n* **Réalisation de la PIA :** Le DPO peut être chargé de réaliser la PIA lui-même, en collaboration avec les équipes du SPSTI. Il doit s'assurer que la PIA est complète, rigoureuse et conforme à la méthodologie de la CNIL.\n* **Validation de la PIA :** Le DPO doit valider la PIA avant sa mise en œuvre. Il doit s'assurer que les risques identifiés sont correctement évalués et que les mesures de protection choisies sont adéquates et efficaces.\n* **Suivi et mise à jour :** Le DPO doit suivre la mise en œuvre des mesures de protection et s'assurer qu'elles restent efficaces dans le temps. Il doit également mettre à jour la PIA si le traitement évolue ou si de nouveaux risques sont identifiés.\n\n**Points importants :**\n\n* **Ressources :** Le SPSTI doit fournir au DPO externe les ressources nécessaires pour réaliser ses missions liées aux PIA : temps, accès à l'information, support des équipes.\n* **Documentation :** Le DPO doit documenter son travail sur les PIA, notamment les risques identifiés, les mesures de protection choisies et les justifications de ses décisions.\n* **Collaboration :** Le DPO doit travailler en étroite collaboration avec les équipes du SPSTI, notamment le service informatique, le service juridique et les médecins du travail.\n\n\nLe guide de la CNIL sur les PIA est une ressource précieuse pour le DPO externe. Il lui fournit une méthodologie claire et des exemples concrets pour réaliser et valider les PIA. En utilisant ce guide et en collaborant avec les équipes du SPSTI, le DPO externe peut contribuer à assurer une protection efficace des données de santé.\n",
|
167 |
+
],
|
168 |
+
},
|
169 |
+
{
|
170 |
+
"role": "user",
|
171 |
+
"parts": [
|
172 |
+
files[4],
|
173 |
+
"voici également un modélè de registre de traitement ",
|
174 |
+
],
|
175 |
+
},
|
176 |
+
{
|
177 |
+
"role": "model",
|
178 |
+
"parts": [
|
179 |
+
"Merci pour le modèle de registre des traitements. C'est un outil essentiel pour la mise en conformité avec le RGPD. Il permet de documenter les traitements de données, d'identifier les risques et de mettre en place les mesures de protection appropriées. \n\nEn tant que DPO (interne ou externe), le registre est un outil indispensable pour :\n\n* **Avoir une vision globale des traitements :** Le registre permet de recenser tous les traitements de données mis en œuvre par le SPSTI, ce qui est essentiel pour identifier les risques et les points d'attention.\n* **Faciliter les analyses d'impact :** Le registre fournit les informations nécessaires pour réaliser les analyses d'impact relatives à la protection des données (PIA).\n* **Répondre aux demandes d'exercice de droits :** Le registre permet de retrouver facilement les informations nécessaires pour répondre aux demandes des personnes concernées (accès, rectification, effacement, etc.).\n* **Démontrer la conformité :** Le registre est un élément de preuve important en cas de contrôle de la CNIL.\n\n\n**Points d'attention pour un SPSTI :**\n\n* **Données sensibles :** Le registre doit identifier clairement les traitements de données sensibles (données de santé, données génétiques, données biométriques, etc.) et les mesures de protection mises en œuvre.\n* **Finalités :** Les finalités de chaque traitement doivent être clairement définies et justifiées.\n* **Bases légales :** La base légale de chaque traitement doit être précisée (obligation légale, consentement, intérêt légitime, etc.).\n* **Destinataires :** Les destinataires des données doivent être identifiés (internes, externes, sous-traitants, etc.).\n* **Transferts hors UE :** Les transferts de données hors de l'Union européenne doivent être documentés et les garanties appropriées doivent être mises en place.\n* **Durées de conservation :** Les durées de conservation des données doivent être définies et justifiées.\n* **Mesures de sécurité :** Les mesures de sécurité techniques et organisationnelles mises en œuvre pour protéger les données doivent être décrites.\n\n\nLe modèle de registre fourni est un bon point de départ, mais il doit être adapté aux spécificités du SPSTI. Il est important de le tenir à jour régulièrement et de s'assurer qu'il reflète fidèlement les traitements de données mis en œuvre.\n\n\nEn complément de ce registre, le DPO peut utiliser d'autres outils pour documenter les traitements et les risques, tels que les PIA, les procédures internes, les contrats avec les sous-traitants, etc.\n\n\n",
|
180 |
+
],
|
181 |
+
},
|
182 |
+
{
|
183 |
+
"role": "user",
|
184 |
+
"parts": [
|
185 |
+
"concernant les boites mails de mes utilisateurs, que dois je faire ?",
|
186 |
+
],
|
187 |
+
},
|
188 |
+
{
|
189 |
+
"role": "model",
|
190 |
+
"parts": [
|
191 |
+
"Les boîtes mail de vos utilisateurs, en particulier dans un SPSTI qui manipule des données de santé, nécessitent une attention particulière au regard du RGPD. Voici les points clés à considérer :\n\n**1. Sensibilisation et formation :**\n\n* **Sensibiliser les utilisateurs aux risques :** Il est crucial de sensibiliser vos utilisateurs (médecins du travail, IPRP, assistants, etc.) aux risques liés à l'utilisation des emails, notamment le phishing, les erreurs d'envoi, la divulgation accidentelle de données sensibles.\n* **Former aux bonnes pratiques :** Formez-les aux bonnes pratiques en matière de sécurité des emails, telles que :\n * Ne pas ouvrir les emails d'origine inconnue ou suspecte.\n * Ne pas cliquer sur les liens ou les pièces jointes dans les emails suspects.\n * Utiliser des mots de passe forts et les changer régulièrement.\n * Ne pas communiquer d'informations sensibles par email, sauf si le message est chiffré.\n * Signaler tout email suspect au service informatique.\n\n**2. Mesures techniques :**\n\n* **Solution de messagerie sécurisée :** Choisissez une solution de messagerie sécurisée qui offre des fonctionnalités telles que le chiffrement des emails, l'anti-spam et l'antivirus.\n* **Authentification forte :** Mettez en place l'authentification forte (par exemple, l'authentification à deux facteurs) pour accéder aux boîtes mail.\n* **Chiffrement des emails :** Encouragez, voire imposez, le chiffrement des emails contenant des données sensibles. Des solutions de chiffrement de bout en bout sont disponibles.\n* **Protection contre les logiciels malveillants :** Installez des logiciels antivirus et anti-malware sur tous les postes de travail et tenez-les à jour.\n* **Filtrage des emails :** Mettez en place un système de filtrage des emails pour bloquer les spams et les emails suspects.\n\n**3. Organisation :**\n\n* **Politique d'utilisation des emails :** Rédigez une politique d'utilisation des emails qui précise les règles à respecter en matière de sécurité et de confidentialité. Cette politique doit être communiquée à tous les utilisateurs et régulièrement mise à jour.\n* **Procédure de gestion des incidents :** Mettez en place une procédure de gestion des incidents de sécurité liés aux emails (par exemple, en cas d'erreur d'envoi ou de suspicion de phishing).\n* **Conservation des emails :** Définissez des règles de conservation des emails conformes aux exigences légales et aux besoins du SPSTI. Les emails contenant des données de santé doivent être conservés de manière sécurisée et pendant la durée légale.\n* **Suppression des emails :** Mettez en place des procédures pour supprimer les emails qui ne sont plus nécessaires, en veillant à ce que la suppression soit définitive et irréversible.\n\n**4. Aspects RGPD :**\n\n* **Finalités :** Définissez clairement les finalités du traitement des données contenues dans les emails.\n* **Bases légales :** Identifiez la base légale pour chaque traitement (obligation légale, consentement, intérêt légitime, etc.).\n* **Information des personnes concernées :** Informez les personnes concernées sur la manière dont leurs données sont traitées dans le cadre des emails (collecte, finalités, destinataires, durées de conservation, droits, etc.).\n* **Registre des activités de traitement :** Documentez les traitements de données effectués via les emails dans le registre des activités de traitement.\n\n\nEn résumé, la sécurité et la confidentialité des emails sont essentielles pour un SPSTI. En mettant en place les mesures techniques et organisationnelles appropriées, vous pouvez minimiser les risques et vous conformer aux exigences du RGPD. N'hésitez pas à me poser d'autres questions si vous souhaitez approfondir un point particulier.\n",
|
192 |
+
],
|
193 |
+
},
|
194 |
+
{
|
195 |
+
"role": "user",
|
196 |
+
"parts": [
|
197 |
+
"L’aptitude à l’exercice d’une activité sportive est-elle une donnée de santé ?",
|
198 |
+
],
|
199 |
+
},
|
200 |
+
{
|
201 |
+
"role": "model",
|
202 |
+
"parts": [
|
203 |
+
"L'aptitude à l'exercice d'une activité sportive **peut être considérée comme une donnée de santé**, selon le contexte et la manière dont elle est collectée et utilisée.\n\n**Quand l'aptitude sportive est une donnée de santé :**\n\n* **Si elle est liée à un diagnostic médical :** Si l'aptitude est déterminée par un médecin suite à un examen médical et qu'elle est liée à un diagnostic ou à un état de santé particulier (par exemple, une maladie cardiaque, une blessure, etc.), alors elle est clairement une donnée de santé.\n* **Si elle est utilisée pour prendre des décisions concernant la santé :** Si l'aptitude est utilisée pour décider si une personne peut participer à une activité sportive spécifique, pour adapter un programme d'entraînement, ou pour prendre toute autre décision concernant la santé de la personne, alors elle est considérée comme une donnée de santé.\n* **Si elle est collectée par un professionnel de santé :** Si l'aptitude est collectée par un médecin, un kinésithérapeute, ou tout autre professionnel de santé, elle est généralement considérée comme une donnée de santé.\n\n**Quand l'aptitude sportive n'est pas forcément une donnée de santé :**\n\n* **Auto-déclaration sans contexte médical :** Si une personne déclare elle-même son aptitude à pratiquer une activité sportive sans qu'il y ait d'examen médical ou de lien avec une décision concernant sa santé, et que cette information n'est pas utilisée dans un contexte médical, alors elle n'est pas forcément considérée comme une donnée de santé. Par exemple, un formulaire d'inscription à un club de sport qui demande si la personne pratique déjà une activité sportive.\n* **Évaluation de la performance sportive :** Si l'aptitude est évaluée dans le cadre d'un test de performance sportive et qu'elle n'est pas liée à un diagnostic médical, elle n'est pas nécessairement une donnée de santé. Par exemple, un test de VO2 max pour évaluer les capacités physiques d'un athlète.\n\n\n**En résumé :**\n\nLa distinction clé est le **contexte**. Si l'aptitude à l'exercice d'une activité sportive est liée à la santé d'une personne, utilisée dans un contexte médical, ou collectée par un professionnel de santé, alors elle est considérée comme une donnée de santé et doit être traitée conformément au RGPD. Dans les autres cas, elle n'est pas forcément une donnée de santé, mais il est important de respecter les principes généraux du RGPD (finalités, bases légales, information des personnes concernées, etc.).\n\nDans le contexte d'un SPSTI, il est probable que l'aptitude à l'exercice d'une activité sportive soit souvent liée à la santé au travail et donc considérée comme une donnée de santé. Il est donc important d'être vigilant et de traiter cette information avec la même précaution que les autres données de santé.\n",
|
204 |
+
],
|
205 |
+
},
|
206 |
+
{
|
207 |
+
"role": "user",
|
208 |
+
"parts": [
|
209 |
+
"L’information sur un taux d’invalidité, contenue dans un traitement, est-elle une donnée de santé ?",
|
210 |
+
],
|
211 |
+
},
|
212 |
+
{
|
213 |
+
"role": "model",
|
214 |
+
"parts": [
|
215 |
+
"Oui, l'information sur un taux d'invalidité contenue dans un traitement est considérée comme une **donnée de santé** au sens du RGPD.\n\nLe RGPD définit les données de santé comme les données concernant la santé physique ou mentale d'une personne physique, y compris la prestation de services de",
|
216 |
+
],
|
217 |
+
},
|
218 |
+
{
|
219 |
+
"role": "user",
|
220 |
+
"parts": [
|
221 |
+
"Le numéro d’inscription au répertoire national d’identification des personnes physiques (NIR) est-il une donnée de santé ?",
|
222 |
+
],
|
223 |
+
},
|
224 |
+
{
|
225 |
+
"role": "model",
|
226 |
+
"parts": [
|
227 |
+
"Non, le numéro d'inscription au répertoire national d'identification des personnes physiques (NIR), plus communément appelé numéro de sécurité sociale, **n'est pas en soi une donnée de santé** selon le RGPD. \n\nIl s'agit d'une donnée à caractère personnel, et plus précisément d'un identifiant unique. Cependant, il ne révèle rien en soi sur la santé physique ou mentale d'une personne.\n\n**Pourquoi le NIR est sensible dans le contexte de la santé :**\n\nBien que n'étant pas une donnée de santé en soi, le NIR est souvent utilisé dans le secteur de la santé pour identifier les patients et accéder à leurs dossiers médicaux. C'est cette association avec des données de santé qui le rend sensible. L'utilisation du NIR permet de relier facilement cette information à d'autres données concernant la santé de la personne.\n\n**Conséquences pour le traitement du NIR dans un SPSTI :**\n\nDans le cadre d'un SPSTI, le NIR est utilisé pour identifier les salariés et gérer leur suivi médical. De ce fait, il est essentiel de le protéger avec la même rigueur que les données de santé. \n\n* **Minimisation :** Collecter le NIR uniquement si cela est strictement nécessaire pour la finalité du traitement.\n* **Sécurité :** Mettre en place des mesures de sécurité robustes pour protéger le NIR contre tout accès non autorisé, toute divulgation, toute altération ou toute destruction.\n* **Information des personnes concernées :** Informer les salariés sur la collecte et l'utilisation de leur NIR, ainsi que sur leurs droits.\n* **Registre des activités de traitement :** Documenter le traitement du NIR dans le registre des activités de traitement.\n\n\nEn résumé, le NIR n'est pas une donnée de santé en soi, mais son utilisation dans le contexte de la santé nécessite une protection renforcée en raison de son lien avec des données de santé. Il est donc crucial pour un SPSTI de traiter le NIR avec la même précaution que les autres données sensibles.\n",
|
228 |
+
],
|
229 |
+
},
|
230 |
+
]
|
231 |
+
)
|
232 |
+
|
233 |
+
def chat_with_gemini(message):
|
234 |
+
global chat_session # Access the global chat_session
|
235 |
+
|
236 |
+
response = chat_session.send_message(message)
|
237 |
+
return response.text
|
238 |
+
|
239 |
+
|
240 |
+
iface = gr.Interface(
|
241 |
+
fn=chat_with_gemini,
|
242 |
+
inputs=gr.Textbox(lines=5, placeholder="Entrez votre question ici..."),
|
243 |
+
outputs=gr.Textbox(lines=25, label="Réponse de Gemini"),
|
244 |
+
title="Agent IA DPO pour les SPSTi",
|
245 |
+
description="Posez vos questions sur le RGPD et les données de santé en milieu professionnel, en particulier dans le contexte des SPSTi.",
|
246 |
+
theme="huggingface", # Optional: Use a specific theme
|
247 |
+
)
|
248 |
+
|
249 |
+
|
250 |
+
if __name__ == "__main__":
|
251 |
+
iface.launch()
|
code_test.py
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from snmp import CommunityData, ContextData, SNMPv1, SNMPv2c, SNMPv3
|
2 |
+
from snmp import Version
|
3 |
+
from ipaddress import IPv4Network
|
4 |
+
import socket
|
5 |
+
|
6 |
+
def get_printers(community="public", ip_range="192.168.251.0/24", version=Version.V1):
|
7 |
+
oids = {
|
8 |
+
"printer_name": "1.3.6.1.2.1.25.3.2.1.3",
|
9 |
+
"printer_status": "1.3.6.1.2.1.25.3.5.1.1",
|
10 |
+
"printer_location": "1.3.6.1.2.1.1.6"
|
11 |
+
|
12 |
+
}
|
13 |
+
|
14 |
+
printers = []
|
15 |
+
|
16 |
+
for ip in IPv4Network(ip_range):
|
17 |
+
ip_str = str(ip)
|
18 |
+
if ip_str == "192.168.251.249":
|
19 |
+
continue
|
20 |
+
|
21 |
+
try:
|
22 |
+
if version == Version.V1:
|
23 |
+
snmp_client = SNMPv1(CommunityData(community))
|
24 |
+
elif version == Version.V2c:
|
25 |
+
snmp_client = SNMPv2c(CommunityData(community))
|
26 |
+
else: # Version 3
|
27 |
+
snmp_client = SNMPv3(ContextData())
|
28 |
+
|
29 |
+
printer_info = {}
|
30 |
+
|
31 |
+
for key, oid in oids.items():
|
32 |
+
try:
|
33 |
+
result = snmp_client.get(oid, ip_str)
|
34 |
+
printer_info[key] = result.value
|
35 |
+
except socket.timeout:
|
36 |
+
#print(f"Timeout for {ip_str}")
|
37 |
+
break
|
38 |
+
except Exception as e:
|
39 |
+
#print(f"Error querying {ip_str}: {e}")
|
40 |
+
break
|
41 |
+
|
42 |
+
if printer_info:
|
43 |
+
printer_info["ip"] = ip_str
|
44 |
+
printers.append(printer_info)
|
45 |
+
|
46 |
+
except Exception as e:
|
47 |
+
# print(f"SNMP error for {ip_str}: {e}") # Handle SNMP errors
|
48 |
+
pass
|
49 |
+
|
50 |
+
return printers
|
51 |
+
|
52 |
+
|
53 |
+
|
54 |
+
|
55 |
+
if __name__ == "__main__":
|
56 |
+
printers = get_printers()
|
57 |
+
if printers:
|
58 |
+
for printer in printers:
|
59 |
+
print(printer)
|
60 |
+
else:
|
61 |
+
print("No printers found.")
|
factorial.py
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
from datetime import datetime, timedelta
|
3 |
+
|
4 |
+
last_month = datetime.now() - timedelta(days=30)
|
5 |
+
last_month_timestamp = int(last_month.timestamp())
|
6 |
+
|
7 |
+
command = f"last -t {last_month_timestamp}"
|
8 |
+
output = os.popen(command).read()
|
9 |
+
print(output)
|
10 |
+
|
11 |
+
lines = output.strip().split('\n')
|
12 |
+
login_count = len(lines) -1
|
13 |
+
print(f"\nNombre de connexions depuis le mois dernier: {login_count}")
|
14 |
+
|
generated_code_20241109_123707.py
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from scapy.all import *
|
2 |
+
import sys
|
3 |
+
|
4 |
+
conf.iface = "eno1"
|
5 |
+
target_ip = "192.168.251.253"
|
6 |
+
my_ip = "192.168.251.249"
|
7 |
+
|
8 |
+
ports = range(1, 1025) # Ports to scan
|
9 |
+
|
10 |
+
open_ports = []
|
11 |
+
|
12 |
+
for port in ports:
|
13 |
+
pkt = IP(dst=target_ip, src=my_ip)/TCP(dport=port, flags="S")
|
14 |
+
response = sr1(pkt, timeout=1, verbose=0)
|
15 |
+
|
16 |
+
if response is None:
|
17 |
+
pass # No response
|
18 |
+
elif response.haslayer(TCP):
|
19 |
+
if response.getlayer(TCP).flags == 0x12: # SYN-ACK
|
20 |
+
send(IP(dst=target_ip, src=my_ip)/TCP(dport=port, flags="R"), verbose=0) # Send RST to close connection
|
21 |
+
open_ports.append(port)
|
22 |
+
elif response.getlayer(TCP).flags == 0x14: # RST
|
23 |
+
pass # Port closed
|
24 |
+
|
25 |
+
print(f"Open ports on {target_ip}: {open_ports}")
|
26 |
+
|
generated_code_20241110_105740.py
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from ldap3 import Server, Connection, ALL
|
2 |
+
from loguru import logger
|
3 |
+
|
4 |
+
logger.add("ldap_log.log", level="DEBUG")
|
5 |
+
|
6 |
+
server_uri = "192.168.251.8"
|
7 |
+
try:
|
8 |
+
server = Server(server_uri, get_info=ALL)
|
9 |
+
logger.debug(f"Server info: {server.info}")
|
10 |
+
conn = Connection(server, auto_bind=True)
|
11 |
+
logger.debug("Successfully bound to the server")
|
12 |
+
|
13 |
+
search_base = "dc=example,dc=com" # Replace with your AD domain base DN
|
14 |
+
search_filter = "(objectClass=*)"
|
15 |
+
attributes = ["*"]
|
16 |
+
|
17 |
+
conn.search(search_base=search_base, search_filter=search_filter, attributes=attributes)
|
18 |
+
logger.debug(f"Search results: {conn.entries}")
|
19 |
+
|
20 |
+
except Exception as e:
|
21 |
+
logger.exception(f"Error: {e}")
|
22 |
+
|
23 |
+
finally:
|
24 |
+
if 'conn' in locals() and conn:
|
25 |
+
conn.unbind()
|
26 |
+
|
ldap_log.log
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
2024-11-10 10:57:40.342 | DEBUG | __main__:<module>:9 - Server info: None
|
2 |
+
2024-11-10 10:57:40.348 | DEBUG | __main__:<module>:11 - Successfully bound to the server
|
3 |
+
2024-11-10 10:57:40.350 | DEBUG | __main__:<module>:18 - Search results: []
|
scan_results.log
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
2024-11-09 18:50:22.891 | INFO | __main__:<module>:16 - Scan results for 192.168.251.113:
|
2 |
+
2024-11-09 18:50:22.891 | INFO | __main__:<module>:19 - Port 22/open - ssh (7.4)
|
3 |
+
2024-11-09 18:50:22.893 | WARNING | __main__:<module>:24 - Port 22 is reachable and potentially vulnerable.
|
4 |
+
2024-11-09 18:50:22.893 | INFO | __main__:<module>:19 - Port 80/open - http (2.4.6)
|
5 |
+
2024-11-09 18:50:22.894 | WARNING | __main__:<module>:24 - Port 80 is reachable and potentially vulnerable.
|
6 |
+
2024-11-09 18:50:22.894 | INFO | __main__:<module>:19 - Port 514/open - shell ()
|
7 |
+
2024-11-09 18:50:22.895 | WARNING | __main__:<module>:24 - Port 514 is reachable and potentially vulnerable.
|
8 |
+
2024-11-09 18:50:22.895 | INFO | __main__:<module>:19 - Port 3306/open - mysql ()
|
9 |
+
2024-11-09 18:50:22.895 | WARNING | __main__:<module>:24 - Port 3306 is reachable and potentially vulnerable.
|
10 |
+
2024-11-09 18:50:22.896 | INFO | __main__:<module>:19 - Port 4000/open - http ()
|
11 |
+
2024-11-09 18:50:22.896 | WARNING | __main__:<module>:24 - Port 4000 is reachable and potentially vulnerable.
|
12 |
+
2024-11-09 18:50:22.896 | INFO | __main__:<module>:19 - Port 5000/open - http ()
|
13 |
+
2024-11-09 18:50:22.897 | WARNING | __main__:<module>:24 - Port 5000 is reachable and potentially vulnerable.
|
14 |
+
2024-11-09 18:50:22.897 | INFO | __main__:<module>:19 - Port 5021/open - http ()
|
15 |
+
2024-11-09 18:50:22.898 | WARNING | __main__:<module>:24 - Port 5021 is reachable and potentially vulnerable.
|
16 |
+
2024-11-09 18:50:22.898 | INFO | __main__:<module>:19 - Port 5218/open - http ()
|
17 |
+
2024-11-09 18:50:22.898 | WARNING | __main__:<module>:24 - Port 5218 is reachable and potentially vulnerable.
|
18 |
+
2024-11-09 18:50:22.898 | INFO | __main__:<module>:19 - Port 5318/open - http ()
|
19 |
+
2024-11-09 18:50:22.899 | WARNING | __main__:<module>:24 - Port 5318 is reachable and potentially vulnerable.
|
20 |
+
2024-11-09 18:50:22.899 | INFO | __main__:<module>:19 - Port 5500/open - hotline ()
|
21 |
+
2024-11-09 18:50:22.899 | WARNING | __main__:<module>:24 - Port 5500 is reachable and potentially vulnerable.
|
22 |
+
2024-11-09 18:50:22.899 | INFO | __main__:<module>:19 - Port 5600/open - esmmanager ()
|
23 |
+
2024-11-09 18:50:22.901 | WARNING | __main__:<module>:24 - Port 5600 is reachable and potentially vulnerable.
|
24 |
+
2024-11-09 18:50:22.901 | INFO | __main__:<module>:19 - Port 8000/open - http-alt ()
|
25 |
+
2024-11-09 18:50:22.903 | WARNING | __main__:<module>:24 - Port 8000 is reachable and potentially vulnerable.
|
26 |
+
2024-11-09 18:50:22.903 | INFO | __main__:<module>:19 - Port 27017/open - mongod ()
|
27 |
+
2024-11-09 18:50:22.907 | WARNING | __main__:<module>:24 - Port 27017 is reachable and potentially vulnerable.
|
28 |
+
2024-11-09 18:50:22.907 | WARNING | __main__:<module>:31 - Open ports detected: [22, 80, 514, 3306, 4000, 5000, 5021, 5218, 5318, 5500, 5600, 8000, 27017]
|
29 |
+
2024-11-09 18:51:44.327 | INFO | __main__:<module>:26 - Port 22 is open. Service: ssh, Version: 7.4
|
30 |
+
2024-11-09 18:51:44.327 | INFO | __main__:<module>:26 - Port 80 is open. Service: http, Version: 2.4.6
|
31 |
+
2024-11-09 18:51:44.328 | INFO | __main__:<module>:28 - Port 443 is closed
|
32 |
+
2024-11-09 18:51:44.329 | WARNING | __main__:<module>:34 - Port 22 (SSH) is open. This could be a security risk if not properly configured.
|
33 |
+
2024-11-09 18:51:44.329 | WARNING | __main__:<module>:39 - Port 80 (HTTP) or 443 (HTTPS) is open. Ensure web server security best practices are followed.
|
34 |
+
2024-11-09 18:51:44.330 | INFO | __main__:<module>:45 - Possible OS:
|
35 |
+
2024-11-09 18:51:44.330 | INFO | __main__:<module>:47 - Name: Linux 3.2 - 4.9, Accuracy: 100
|
templates/index.html
ADDED
@@ -0,0 +1,120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="fr">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8">
|
5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
+
<title>Chat avec IA</title>
|
7 |
+
<style>
|
8 |
+
body {
|
9 |
+
font-family: Arial, sans-serif;
|
10 |
+
margin: 0;
|
11 |
+
padding: 0;
|
12 |
+
display: flex;
|
13 |
+
justify-content: center;
|
14 |
+
align-items: center;
|
15 |
+
height: 100vh;
|
16 |
+
background-color: #f4f4f9;
|
17 |
+
}
|
18 |
+
.chat-container {
|
19 |
+
width: 400px;
|
20 |
+
background-color: #fff;
|
21 |
+
border-radius: 10px;
|
22 |
+
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
23 |
+
overflow: hidden;
|
24 |
+
}
|
25 |
+
.chat-header {
|
26 |
+
background-color: #007bff;
|
27 |
+
color: #fff;
|
28 |
+
padding: 10px;
|
29 |
+
text-align: center;
|
30 |
+
}
|
31 |
+
.chat-messages {
|
32 |
+
height: 300px;
|
33 |
+
padding: 10px;
|
34 |
+
overflow-y: scroll;
|
35 |
+
border-bottom: 1px solid #ddd;
|
36 |
+
}
|
37 |
+
.chat-input {
|
38 |
+
display: flex;
|
39 |
+
padding: 10px;
|
40 |
+
}
|
41 |
+
.chat-input input {
|
42 |
+
flex: 1;
|
43 |
+
padding: 10px;
|
44 |
+
border: 1px solid #ddd;
|
45 |
+
border-radius: 5px;
|
46 |
+
}
|
47 |
+
.chat-input button {
|
48 |
+
padding: 10px 20px;
|
49 |
+
margin-left: 10px;
|
50 |
+
border: none;
|
51 |
+
background-color: #007bff;
|
52 |
+
color: #fff;
|
53 |
+
border-radius: 5px;
|
54 |
+
cursor: pointer;
|
55 |
+
}
|
56 |
+
.chat-input button:hover {
|
57 |
+
background-color: #0056b3;
|
58 |
+
}
|
59 |
+
.message {
|
60 |
+
margin-bottom: 10px;
|
61 |
+
}
|
62 |
+
.message.user {
|
63 |
+
text-align: right;
|
64 |
+
}
|
65 |
+
.message.bot {
|
66 |
+
text-align: left;
|
67 |
+
}
|
68 |
+
</style>
|
69 |
+
</head>
|
70 |
+
<body>
|
71 |
+
<div class="chat-container">
|
72 |
+
<div class="chat-header">
|
73 |
+
<h2>Chat avec IA</h2>
|
74 |
+
</div>
|
75 |
+
<div class="chat-messages" id="chat-messages">
|
76 |
+
<!-- Messages will be appended here -->
|
77 |
+
</div>
|
78 |
+
<div class="chat-input">
|
79 |
+
<input type="text" id="user-input" placeholder="Écrivez votre message...">
|
80 |
+
<button onclick="sendMessage()">Envoyer</button>
|
81 |
+
</div>
|
82 |
+
</div>
|
83 |
+
|
84 |
+
<script>
|
85 |
+
function sendMessage() {
|
86 |
+
const userInput = document.getElementById('user-input').value;
|
87 |
+
if (userInput.trim() === '') return;
|
88 |
+
|
89 |
+
// Ajouter le message de l'utilisateur à la conversation
|
90 |
+
addMessage(userInput, 'user');
|
91 |
+
|
92 |
+
// Envoyer le message à l'IA
|
93 |
+
fetch('/chat', {
|
94 |
+
method: 'POST',
|
95 |
+
headers: {
|
96 |
+
'Content-Type': 'application/json'
|
97 |
+
},
|
98 |
+
body: JSON.stringify({ message: userInput })
|
99 |
+
})
|
100 |
+
.then(response => response.json())
|
101 |
+
.then(data => {
|
102 |
+
// Ajouter la réponse de l'IA à la conversation
|
103 |
+
addMessage(data.response, 'bot');
|
104 |
+
});
|
105 |
+
|
106 |
+
// Effacer le champ d'entrée
|
107 |
+
document.getElementById('user-input').value = '';
|
108 |
+
}
|
109 |
+
|
110 |
+
function addMessage(text, sender) {
|
111 |
+
const chatMessages = document.getElementById('chat-messages');
|
112 |
+
const messageElement = document.createElement('div');
|
113 |
+
messageElement.classList.add('message', sender);
|
114 |
+
messageElement.textContent = text;
|
115 |
+
chatMessages.appendChild(messageElement);
|
116 |
+
chatMessages.scrollTop = chatMessages.scrollHeight;
|
117 |
+
}
|
118 |
+
</script>
|
119 |
+
</body>
|
120 |
+
</html>
|
templates/index2.html
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!-- templates/index.html -->
|
2 |
+
<!DOCTYPE html>
|
3 |
+
<html lang="fr">
|
4 |
+
<head>
|
5 |
+
<meta charset="UTF-8">
|
6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
7 |
+
<title>Interface Gemini</title>
|
8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
9 |
+
</head>
|
10 |
+
<body class="bg-gray-100 min-h-screen p-12">
|
11 |
+
<div class="">
|
12 |
+
<h1 class="text-3xl font-bold mb-8 text-center">Interface Gemini - Générateur de Code</h1>
|
13 |
+
|
14 |
+
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
|
15 |
+
<form id="prompt-form" enctype="multipart/form-data">
|
16 |
+
<textarea id="prompt" class="w-full h-32 p-4 border rounded-lg mb-4"
|
17 |
+
placeholder="Entrez votre demande ici..."></textarea>
|
18 |
+
<input type="file" name="pdf_file" accept=".pdf" class="mb-4">
|
19 |
+
<button type="submit"
|
20 |
+
class="w-full bg-blue-500 text-white py-2 px-4 rounded-lg hover:bg-blue-600">
|
21 |
+
Générer et Exécuter
|
22 |
+
</button>
|
23 |
+
</form>
|
24 |
+
</div>
|
25 |
+
|
26 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
27 |
+
<div class="bg-white rounded-lg shadow-md p-6">
|
28 |
+
<h2 class="text-xl font-semibold mb-4">Code Généré</h2>
|
29 |
+
<pre id="generatedCode" class="bg-gray-100 p-4 rounded-lg overflow-x-auto"></pre>
|
30 |
+
</div>
|
31 |
+
<div class="bg-white rounded-lg shadow-md p-6">
|
32 |
+
<h2 class="text-xl font-semibold mb-4">Résultat de l'Exécution</h2>
|
33 |
+
<pre id="output" class="bg-gray-100 p-4 rounded-lg overflow-x-auto"></pre>
|
34 |
+
</div>
|
35 |
+
</div>
|
36 |
+
</div>
|
37 |
+
|
38 |
+
<script>
|
39 |
+
const form = document.getElementById('prompt-form');
|
40 |
+
|
41 |
+
form.addEventListener('submit', async (event) => {
|
42 |
+
event.preventDefault();
|
43 |
+
|
44 |
+
const prompt = document.getElementById('prompt').value;
|
45 |
+
const generatedCodeElement = document.getElementById('generatedCode');
|
46 |
+
const outputElement = document.getElementById('output');
|
47 |
+
const pdfFile = document.querySelector('input[name="pdf_file"]').files[0];
|
48 |
+
|
49 |
+
try {
|
50 |
+
const formData = new FormData();
|
51 |
+
formData.append('prompt', prompt);
|
52 |
+
|
53 |
+
if (pdfFile) {
|
54 |
+
formData.append('pdf_file', pdfFile);
|
55 |
+
}
|
56 |
+
|
57 |
+
const response = await fetch('/generate', {
|
58 |
+
method: 'POST',
|
59 |
+
body: formData // Ne pas définir le Content-Type, il sera automatiquement défini
|
60 |
+
});
|
61 |
+
|
62 |
+
if (!response.ok) {
|
63 |
+
throw new Error(`Erreur ${response.status}: ${response.statusText}`);
|
64 |
+
}
|
65 |
+
|
66 |
+
const data = await response.json();
|
67 |
+
generatedCodeElement.textContent = data.code;
|
68 |
+
outputElement.textContent = data.output;
|
69 |
+
} catch (error) {
|
70 |
+
console.error('Erreur:', error);
|
71 |
+
outputElement.textContent = `Erreur: ${error.message}`;
|
72 |
+
}
|
73 |
+
});
|
74 |
+
</script>
|
75 |
+
</body>
|
76 |
+
</html>
|
templates/index3.html
ADDED
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!-- templates/index.html -->
|
2 |
+
<!DOCTYPE html>
|
3 |
+
<html lang="fr">
|
4 |
+
<head>
|
5 |
+
<meta charset="UTF-8">
|
6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
7 |
+
<title>Interface Gemini</title>
|
8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
9 |
+
</head>
|
10 |
+
<body class="bg-gray-100 min-h-screen p-12">
|
11 |
+
<div class="">
|
12 |
+
<h1 class="text-3xl font-bold mb-8 text-center">Interface Gemini - Générateur de Code</h1>
|
13 |
+
|
14 |
+
<div class="bg-white rounded-lg shadow-md p-6 mb-6">
|
15 |
+
<textarea id="prompt" class="w-full h-32 p-4 border rounded-lg mb-4"
|
16 |
+
placeholder="Entrez votre demande ici..."></textarea>
|
17 |
+
<button onclick="generateCode()"
|
18 |
+
class="w-full bg-blue-500 text-white py-2 px-4 rounded-lg hover:bg-blue-600">
|
19 |
+
Générer et Exécuter
|
20 |
+
</button>
|
21 |
+
</div>
|
22 |
+
|
23 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
24 |
+
<div class="bg-white rounded-lg shadow-md p-6">
|
25 |
+
<h2 class="text-xl font-semibold mb-4">Code Généré</h2>
|
26 |
+
<pre id="generatedCode" class="bg-gray-100 p-4 rounded-lg overflow-x-auto"></pre>
|
27 |
+
</div>
|
28 |
+
<div class="bg-white rounded-lg shadow-md p-6">
|
29 |
+
<h2 class="text-xl font-semibold mb-4">Résultat de l'Exécution</h2>
|
30 |
+
<pre id="output" class="bg-gray-100 p-4 rounded-lg overflow-x-auto"></pre>
|
31 |
+
</div>
|
32 |
+
</div>
|
33 |
+
</div>
|
34 |
+
|
35 |
+
<script>
|
36 |
+
async function generateCode() {
|
37 |
+
const prompt = document.getElementById('prompt').value;
|
38 |
+
const generatedCodeElement = document.getElementById('generatedCode');
|
39 |
+
const outputElement = document.getElementById('output');
|
40 |
+
|
41 |
+
try {
|
42 |
+
const response = await fetch('/generate', {
|
43 |
+
method: 'POST',
|
44 |
+
headers: {
|
45 |
+
'Content-Type': 'application/json',
|
46 |
+
},
|
47 |
+
body: JSON.stringify({ prompt }),
|
48 |
+
});
|
49 |
+
|
50 |
+
if (!response.ok) {
|
51 |
+
throw new Error('Erreur lors de la génération du code');
|
52 |
+
}
|
53 |
+
|
54 |
+
const data = await response.json();
|
55 |
+
|
56 |
+
generatedCodeElement.textContent = data.code;
|
57 |
+
outputElement.textContent = data.output;
|
58 |
+
} catch (error) {
|
59 |
+
outputElement.textContent = `Erreur: ${error.message}`;
|
60 |
+
}
|
61 |
+
}
|
62 |
+
</script>
|
63 |
+
</body>
|
64 |
+
</html>
|
test.pdf
ADDED
Binary file (768 kB). View file
|
|
test.py
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# app.py
|
2 |
+
from flask import Flask, render_template, request, jsonify
|
3 |
+
import os
|
4 |
+
import google.generativeai as genai
|
5 |
+
import subprocess
|
6 |
+
from datetime import datetime
|
7 |
+
|
8 |
+
app = Flask(__name__)
|
9 |
+
|
10 |
+
# Configuration de l'API Gemini
|
11 |
+
genai.configure(api_key="AIzaSyD1TJ82gJaI9fL239kdsk6d4t-oLL3G2PE")
|
12 |
+
|
13 |
+
def initialize_chat():
|
14 |
+
model = genai.GenerativeModel(
|
15 |
+
model_name='gemini-1.5-pro',
|
16 |
+
system_instruction="tu es un générateur de code python. Tu peux utiliser seulement les librairie scapy,nmap,pyshark,loguru,pandas,psutil,celery,ldap3 si besoin.l'interface réseau de ma machine est 'eno1';mon adresse ip est '192.168.251.249'. tu dois générer le code complet pour qu'il puisse être exécuté; rajouter les commandes 'verbose' lors de l'utilisation des outils;ne génère pas de commentaires, de fichiers logs, ni d'explications"
|
17 |
+
)
|
18 |
+
return model.start_chat(history=[
|
19 |
+
{"role": "user", "parts": "Bonjour"},
|
20 |
+
{"role": "model", "parts": "Bonjour, je suis un générateur de code python et je ne génère que du code python"},
|
21 |
+
])
|
22 |
+
|
23 |
+
def execute_code(code):
|
24 |
+
filename = f"generated_code_{datetime.now().strftime('%Y%m%d_%H%M%S')}.py"
|
25 |
+
|
26 |
+
with open(filename, "w") as f:
|
27 |
+
f.write(code)
|
28 |
+
|
29 |
+
try:
|
30 |
+
result = subprocess.run(["python3", filename], capture_output=True, text=True, check=True)
|
31 |
+
output = result.stdout
|
32 |
+
except subprocess.CalledProcessError as e:
|
33 |
+
output = f"Erreur d'exécution:\n{e.stderr}"
|
34 |
+
#finally:
|
35 |
+
# Nettoyer le fichier temporaire
|
36 |
+
#if os.path.exists(filename):
|
37 |
+
#os.remove(filename)
|
38 |
+
|
39 |
+
return output
|
40 |
+
|
41 |
+
@app.route('/')
|
42 |
+
def home():
|
43 |
+
return render_template('index.html')
|
44 |
+
|
45 |
+
@app.route('/generate', methods=['POST'])
|
46 |
+
def generate():
|
47 |
+
prompt = request.json.get('prompt')
|
48 |
+
|
49 |
+
if not prompt:
|
50 |
+
return jsonify({'error': 'Prompt manquant'}), 400
|
51 |
+
|
52 |
+
try:
|
53 |
+
chat = initialize_chat()
|
54 |
+
response = chat.send_message(prompt)
|
55 |
+
|
56 |
+
# Nettoyer le code généré
|
57 |
+
code = response.text.replace("```python\n", "").replace("```", "")
|
58 |
+
|
59 |
+
# Exécuter le code
|
60 |
+
output = execute_code(code)
|
61 |
+
|
62 |
+
return jsonify({
|
63 |
+
'code': code,
|
64 |
+
'output': output
|
65 |
+
})
|
66 |
+
except Exception as e:
|
67 |
+
return jsonify({'error': str(e)}), 500
|
68 |
+
|
69 |
+
if __name__ == '__main__':
|
70 |
+
app.run(debug=True, host="0.0.0.0")
|
test2.py
ADDED
@@ -0,0 +1,150 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from flask import Flask, render_template, request, jsonify
|
2 |
+
import os
|
3 |
+
import google.generativeai as genai
|
4 |
+
import subprocess
|
5 |
+
from datetime import datetime
|
6 |
+
from pathlib import Path
|
7 |
+
import secrets
|
8 |
+
from functools import wraps
|
9 |
+
|
10 |
+
app = Flask(__name__)
|
11 |
+
app.config['SECRET_KEY'] = secrets.token_hex(32)
|
12 |
+
|
13 |
+
# Secure configuration - Move to environment variables
|
14 |
+
ALLOWED_LIBRARIES = {'scapy', 'nmap', 'loguru', 'pandas', 'psutil', 'celery', 'ldap3', 'os', 'datetime', 'moment', 'time'}
|
15 |
+
NETWORK_INTERFACE = 'eno1'
|
16 |
+
IP_ADDRESS = '192.168.251.249'
|
17 |
+
MACHINE_OS = 'linux'
|
18 |
+
GEMINI_API_KEY = "AIzaSyD1TJ82gJaI9fL239kdsk6d4t-oLL3G2PE" # Move API key to environment variable
|
19 |
+
|
20 |
+
if not GEMINI_API_KEY:
|
21 |
+
raise ValueError("GEMINI_API_KEY environment variable is not set")
|
22 |
+
|
23 |
+
genai.configure(api_key=GEMINI_API_KEY)
|
24 |
+
|
25 |
+
def rate_limit(max_calls, time_frame):
|
26 |
+
def decorator(f):
|
27 |
+
calls = {}
|
28 |
+
@wraps(f)
|
29 |
+
def wrapper(*args, **kwargs):
|
30 |
+
now = datetime.now()
|
31 |
+
ip = request.remote_addr
|
32 |
+
if ip not in calls:
|
33 |
+
calls[ip] = []
|
34 |
+
# Clean old calls
|
35 |
+
calls[ip] = [call_time for call_time in calls[ip]
|
36 |
+
if (now - call_time).total_seconds() < time_frame]
|
37 |
+
if len(calls[ip]) >= max_calls:
|
38 |
+
return jsonify({'error': 'Rate limit exceeded'}), 429
|
39 |
+
calls[ip].append(now)
|
40 |
+
return f(*args, **kwargs)
|
41 |
+
return wrapper
|
42 |
+
return decorator
|
43 |
+
|
44 |
+
def initialize_chat():
|
45 |
+
model = genai.GenerativeModel(
|
46 |
+
model_name='gemini-1.5-pro',
|
47 |
+
system_instruction=(
|
48 |
+
"You are a Python code generator.Your machine is a linux system. Only use the following libraries: "
|
49 |
+
f"{', '.join(ALLOWED_LIBRARIES)}. Network interface: {NETWORK_INTERFACE}; "
|
50 |
+
f"IP address: {IP_ADDRESS}. Generate complete, executable code with verbose "
|
51 |
+
"commands. Do not generate comments, log files, or explanations."
|
52 |
+
"si tu dois travailler sur des répertoires, tu dois vérifier s'ils existent avant"
|
53 |
+
)
|
54 |
+
)
|
55 |
+
return model.start_chat(history=[
|
56 |
+
{"role": "user", "parts": "Bonjour"},
|
57 |
+
{"role": "model", "parts": "Bonjour, je suis un générateur de code python et je ne génère que du code python"},
|
58 |
+
])
|
59 |
+
|
60 |
+
def validate_code(code):
|
61 |
+
"""Validate that the code only imports allowed libraries."""
|
62 |
+
import ast
|
63 |
+
try:
|
64 |
+
tree = ast.parse(code)
|
65 |
+
for node in ast.walk(tree):
|
66 |
+
if isinstance(node, ast.Import):
|
67 |
+
for name in node.names:
|
68 |
+
if name.name.split('.')[0] not in ALLOWED_LIBRARIES:
|
69 |
+
return False
|
70 |
+
elif isinstance(node, ast.ImportFrom):
|
71 |
+
if node.module.split('.')[0] not in ALLOWED_LIBRARIES:
|
72 |
+
return False
|
73 |
+
return True
|
74 |
+
except SyntaxError:
|
75 |
+
return False
|
76 |
+
|
77 |
+
def secure_execute_code(code):
|
78 |
+
"""Execute code in a secure manner with timeout and resource limits."""
|
79 |
+
if not validate_code(code):
|
80 |
+
return "Error: Code contains unauthorized imports"
|
81 |
+
|
82 |
+
# Create a secure directory for temporary files
|
83 |
+
temp_dir = Path("secure_temp")
|
84 |
+
temp_dir.mkdir(exist_ok=True)
|
85 |
+
|
86 |
+
filename = temp_dir / f"generated_code_{secrets.token_hex(8)}.py"
|
87 |
+
|
88 |
+
try:
|
89 |
+
with open(filename, "w") as f:
|
90 |
+
f.write(code)
|
91 |
+
|
92 |
+
# Execute with resource limits and timeout
|
93 |
+
result = subprocess.run(
|
94 |
+
["python3", str(filename)],
|
95 |
+
capture_output=True,
|
96 |
+
text=True,
|
97 |
+
timeout=300, # 30 second timeout
|
98 |
+
check=True
|
99 |
+
)
|
100 |
+
return result.stdout
|
101 |
+
except subprocess.TimeoutExpired:
|
102 |
+
return "Error: Execution timeout"
|
103 |
+
except subprocess.CalledProcessError as e:
|
104 |
+
return f"Execution error:\n{e.stderr}"
|
105 |
+
except Exception as e:
|
106 |
+
return f"Error: {str(e)}"
|
107 |
+
finally:
|
108 |
+
# Clean up
|
109 |
+
if filename.exists():
|
110 |
+
filename.unlink()
|
111 |
+
|
112 |
+
@app.route('/')
|
113 |
+
def home():
|
114 |
+
return render_template('index.html')
|
115 |
+
|
116 |
+
@app.route('/generate', methods=['POST'])
|
117 |
+
@rate_limit(max_calls=10, time_frame=60) # 10 calls per minute
|
118 |
+
def generate():
|
119 |
+
if not request.is_json:
|
120 |
+
return jsonify({'error': 'Content-Type must be application/json'}), 415
|
121 |
+
|
122 |
+
prompt = request.json.get('prompt')
|
123 |
+
|
124 |
+
if not prompt:
|
125 |
+
return jsonify({'error': 'Missing prompt'}), 400
|
126 |
+
|
127 |
+
try:
|
128 |
+
chat = initialize_chat()
|
129 |
+
response = chat.send_message(prompt)
|
130 |
+
|
131 |
+
# Clean generated code
|
132 |
+
code = response.text.strip()
|
133 |
+
if code.startswith("```python"):
|
134 |
+
code = code[10:]
|
135 |
+
if code.endswith("```"):
|
136 |
+
code = code[:-3]
|
137 |
+
code = code.strip()
|
138 |
+
|
139 |
+
# Execute code
|
140 |
+
output = secure_execute_code(code)
|
141 |
+
|
142 |
+
return jsonify({
|
143 |
+
'code': code,
|
144 |
+
'output': output
|
145 |
+
})
|
146 |
+
except Exception as e:
|
147 |
+
return jsonify({'error': str(e)}), 500
|
148 |
+
|
149 |
+
if __name__ == '__main__':
|
150 |
+
app.run(debug=False, host="0.0.0.0")
|
test3.py
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import time
|
3 |
+
import datetime
|
4 |
+
import moment
|
5 |
+
|
6 |
+
def recent_files(days=7, directory="/"):
|
7 |
+
now = time.time()
|
8 |
+
cutoff = now - (days * 86400)
|
9 |
+
|
10 |
+
result = []
|
11 |
+
|
12 |
+
for root, _, files in os.walk(directory):
|
13 |
+
for file in files:
|
14 |
+
full_path = os.path.join(root, file)
|
15 |
+
stat = os.stat(full_path)
|
16 |
+
|
17 |
+
if stat.st_ctime > cutoff or stat.st_mtime > cutoff:
|
18 |
+
mtime = datetime.datetime.fromtimestamp(stat.st_mtime).strftime('%Y-%m-%d %H:%M:%S')
|
19 |
+
ctime = datetime.datetime.fromtimestamp(stat.st_ctime).strftime('%Y-%m-%d %H:%M:%S')
|
20 |
+
result.append({"path": full_path, "mtime": mtime, "ctime": ctime})
|
21 |
+
|
22 |
+
|
23 |
+
return result
|
24 |
+
|
25 |
+
recent_files_list = recent_files(days=1, directory="/home")
|
26 |
+
|
27 |
+
for item in recent_files_list:
|
28 |
+
print(f"Path: {item['path']}, Modified Time: {item['mtime']}, Created Time: {item['ctime']}")
|
test4.py
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import google.generativeai as genai
|
3 |
+
|
4 |
+
genai.configure(api_key="AIzaSyD1TJ82gJaI9fL239kdsk6d4t-oLL3G2PE") # Remplacez par votre clé API
|
5 |
+
|
6 |
+
model = genai.GenerativeModel(model_name='gemini-1.5-pro', tools=[genai.Tool.CODE_EXECUTION])
|
7 |
+
|
8 |
+
chat = model.start_chat()
|
9 |
+
|
10 |
+
# Première requête: Demander le code
|
11 |
+
response = chat.send_message("What is the sum of the first 50 prime numbers? Generate Python code for the calculation, and make sure you get all 50.")
|
12 |
+
|
13 |
+
# Extraire le code de la réponse (Gemini devrait le fournir dans un bloc de code)
|
14 |
+
code_block = None
|
15 |
+
for tool_code in response.tool_code:
|
16 |
+
if tool_code.type == 'code':
|
17 |
+
code_block = tool_code
|
18 |
+
break
|
19 |
+
|
20 |
+
if code_block:
|
21 |
+
# Exécuter le code avec l'outil code_execution
|
22 |
+
execution_response = chat.send_message(code_block.code)
|
23 |
+
|
24 |
+
# Afficher le résultat de l'exécution
|
25 |
+
print(execution_response.text)
|
26 |
+
else:
|
27 |
+
print("Gemini n'a pas retourné de code exécutable.")
|
test_code_gen.py
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from scapy.all import *
|
2 |
+
from loguru import logger
|
3 |
+
import nmap
|
4 |
+
|
5 |
+
# Network interface and local IP
|
6 |
+
interface = "eno1"
|
7 |
+
local_ip = "192.168.251.249"
|
8 |
+
target_ip = "192.168.251.51"
|
9 |
+
|
10 |
+
# Port scanning using nmap
|
11 |
+
nm = nmap.PortScanner()
|
12 |
+
nm.scan(hosts=target_ip, arguments='-T4 -sV -sC')
|
13 |
+
|
14 |
+
|
15 |
+
open_ports = []
|
16 |
+
for proto in nm[target_ip].all_protocols():
|
17 |
+
lport = nm[target_ip][proto].keys()
|
18 |
+
for port in lport:
|
19 |
+
if nm[target_ip][proto][port]['state'] == 'open':
|
20 |
+
open_ports.append((port, nm[target_ip][proto][port]['name'], nm[target_ip][proto][port]['product'], nm[target_ip][proto][port]['version']))
|
21 |
+
|
22 |
+
|
23 |
+
|
24 |
+
if open_ports:
|
25 |
+
print(f"Open ports on {target_ip}:")
|
26 |
+
for port, service, product, version in open_ports:
|
27 |
+
print(f"Port: {port} ({service}), Product: {product}, Version: {version}")
|
28 |
+
|
29 |
+
if "9100" in str(port) or "ipp" in str(port).lower():
|
30 |
+
print("\nPotential vulnerability: Port 9100 (IPP) is often misconfigured and can lead to unauthorized printing or information disclosure.")
|
31 |
+
print("Consider disabling IPP or ensuring proper access controls are in place.\n")
|
32 |
+
if "515" in str(port) or "lpd" in str(port).lower():
|
33 |
+
print("\nPotential vulnerability: Port 515 (LPD) can be exploited for denial-of-service attacks or unauthorized printing.")
|
34 |
+
|
35 |
+
if "631" in str(port) or "ipp" in str(port).lower():
|
36 |
+
print("\nPotential vulnerability: Port 631 (IPP) is often misconfigured and can lead to unauthorized printing or information disclosure.")
|
37 |
+
print("Consider disabling IPP or ensuring proper access controls are in place.\n")
|
38 |
+
|
39 |
+
|
40 |
+
|
41 |
+
else:
|
42 |
+
print(f"No open ports found on {target_ip}")
|
43 |
+
|
44 |
+
|
45 |
+
# Check for common printer vulnerabilities
|
46 |
+
|
47 |
+
|
48 |
+
# Sniffing for printer traffic (requires root privileges)
|
49 |
+
try:
|
50 |
+
print("\nSniffing for printer traffic (first 5 packets)...")
|
51 |
+
packets = sniff(count=5, filter=f"host {target_ip}", iface=interface)
|
52 |
+
if packets:
|
53 |
+
print("Captured packets:")
|
54 |
+
for packet in packets:
|
55 |
+
print(packet.summary())
|
56 |
+
else:
|
57 |
+
print("No printer traffic captured.")
|
58 |
+
except:
|
59 |
+
logger.error("Sniffing requires root privileges.")
|
testgeminicode/bin/Activate.ps1
ADDED
@@ -0,0 +1,247 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<#
|
2 |
+
.Synopsis
|
3 |
+
Activate a Python virtual environment for the current PowerShell session.
|
4 |
+
|
5 |
+
.Description
|
6 |
+
Pushes the python executable for a virtual environment to the front of the
|
7 |
+
$Env:PATH environment variable and sets the prompt to signify that you are
|
8 |
+
in a Python virtual environment. Makes use of the command line switches as
|
9 |
+
well as the `pyvenv.cfg` file values present in the virtual environment.
|
10 |
+
|
11 |
+
.Parameter VenvDir
|
12 |
+
Path to the directory that contains the virtual environment to activate. The
|
13 |
+
default value for this is the parent of the directory that the Activate.ps1
|
14 |
+
script is located within.
|
15 |
+
|
16 |
+
.Parameter Prompt
|
17 |
+
The prompt prefix to display when this virtual environment is activated. By
|
18 |
+
default, this prompt is the name of the virtual environment folder (VenvDir)
|
19 |
+
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
|
20 |
+
|
21 |
+
.Example
|
22 |
+
Activate.ps1
|
23 |
+
Activates the Python virtual environment that contains the Activate.ps1 script.
|
24 |
+
|
25 |
+
.Example
|
26 |
+
Activate.ps1 -Verbose
|
27 |
+
Activates the Python virtual environment that contains the Activate.ps1 script,
|
28 |
+
and shows extra information about the activation as it executes.
|
29 |
+
|
30 |
+
.Example
|
31 |
+
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
|
32 |
+
Activates the Python virtual environment located in the specified location.
|
33 |
+
|
34 |
+
.Example
|
35 |
+
Activate.ps1 -Prompt "MyPython"
|
36 |
+
Activates the Python virtual environment that contains the Activate.ps1 script,
|
37 |
+
and prefixes the current prompt with the specified string (surrounded in
|
38 |
+
parentheses) while the virtual environment is active.
|
39 |
+
|
40 |
+
.Notes
|
41 |
+
On Windows, it may be required to enable this Activate.ps1 script by setting the
|
42 |
+
execution policy for the user. You can do this by issuing the following PowerShell
|
43 |
+
command:
|
44 |
+
|
45 |
+
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
46 |
+
|
47 |
+
For more information on Execution Policies:
|
48 |
+
https://go.microsoft.com/fwlink/?LinkID=135170
|
49 |
+
|
50 |
+
#>
|
51 |
+
Param(
|
52 |
+
[Parameter(Mandatory = $false)]
|
53 |
+
[String]
|
54 |
+
$VenvDir,
|
55 |
+
[Parameter(Mandatory = $false)]
|
56 |
+
[String]
|
57 |
+
$Prompt
|
58 |
+
)
|
59 |
+
|
60 |
+
<# Function declarations --------------------------------------------------- #>
|
61 |
+
|
62 |
+
<#
|
63 |
+
.Synopsis
|
64 |
+
Remove all shell session elements added by the Activate script, including the
|
65 |
+
addition of the virtual environment's Python executable from the beginning of
|
66 |
+
the PATH variable.
|
67 |
+
|
68 |
+
.Parameter NonDestructive
|
69 |
+
If present, do not remove this function from the global namespace for the
|
70 |
+
session.
|
71 |
+
|
72 |
+
#>
|
73 |
+
function global:deactivate ([switch]$NonDestructive) {
|
74 |
+
# Revert to original values
|
75 |
+
|
76 |
+
# The prior prompt:
|
77 |
+
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
|
78 |
+
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
|
79 |
+
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
|
80 |
+
}
|
81 |
+
|
82 |
+
# The prior PYTHONHOME:
|
83 |
+
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
|
84 |
+
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
|
85 |
+
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
|
86 |
+
}
|
87 |
+
|
88 |
+
# The prior PATH:
|
89 |
+
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
|
90 |
+
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
|
91 |
+
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
|
92 |
+
}
|
93 |
+
|
94 |
+
# Just remove the VIRTUAL_ENV altogether:
|
95 |
+
if (Test-Path -Path Env:VIRTUAL_ENV) {
|
96 |
+
Remove-Item -Path env:VIRTUAL_ENV
|
97 |
+
}
|
98 |
+
|
99 |
+
# Just remove VIRTUAL_ENV_PROMPT altogether.
|
100 |
+
if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
|
101 |
+
Remove-Item -Path env:VIRTUAL_ENV_PROMPT
|
102 |
+
}
|
103 |
+
|
104 |
+
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
105 |
+
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
106 |
+
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
107 |
+
}
|
108 |
+
|
109 |
+
# Leave deactivate function in the global namespace if requested:
|
110 |
+
if (-not $NonDestructive) {
|
111 |
+
Remove-Item -Path function:deactivate
|
112 |
+
}
|
113 |
+
}
|
114 |
+
|
115 |
+
<#
|
116 |
+
.Description
|
117 |
+
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
118 |
+
given folder, and returns them in a map.
|
119 |
+
|
120 |
+
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
121 |
+
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
122 |
+
then it is considered a `key = value` line. The left hand string is the key,
|
123 |
+
the right hand is the value.
|
124 |
+
|
125 |
+
If the value starts with a `'` or a `"` then the first and last character is
|
126 |
+
stripped from the value before being captured.
|
127 |
+
|
128 |
+
.Parameter ConfigDir
|
129 |
+
Path to the directory that contains the `pyvenv.cfg` file.
|
130 |
+
#>
|
131 |
+
function Get-PyVenvConfig(
|
132 |
+
[String]
|
133 |
+
$ConfigDir
|
134 |
+
) {
|
135 |
+
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
136 |
+
|
137 |
+
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
138 |
+
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
139 |
+
|
140 |
+
# An empty map will be returned if no config file is found.
|
141 |
+
$pyvenvConfig = @{ }
|
142 |
+
|
143 |
+
if ($pyvenvConfigPath) {
|
144 |
+
|
145 |
+
Write-Verbose "File exists, parse `key = value` lines"
|
146 |
+
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
147 |
+
|
148 |
+
$pyvenvConfigContent | ForEach-Object {
|
149 |
+
$keyval = $PSItem -split "\s*=\s*", 2
|
150 |
+
if ($keyval[0] -and $keyval[1]) {
|
151 |
+
$val = $keyval[1]
|
152 |
+
|
153 |
+
# Remove extraneous quotations around a string value.
|
154 |
+
if ("'""".Contains($val.Substring(0, 1))) {
|
155 |
+
$val = $val.Substring(1, $val.Length - 2)
|
156 |
+
}
|
157 |
+
|
158 |
+
$pyvenvConfig[$keyval[0]] = $val
|
159 |
+
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
160 |
+
}
|
161 |
+
}
|
162 |
+
}
|
163 |
+
return $pyvenvConfig
|
164 |
+
}
|
165 |
+
|
166 |
+
|
167 |
+
<# Begin Activate script --------------------------------------------------- #>
|
168 |
+
|
169 |
+
# Determine the containing directory of this script
|
170 |
+
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
171 |
+
$VenvExecDir = Get-Item -Path $VenvExecPath
|
172 |
+
|
173 |
+
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
174 |
+
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
175 |
+
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
176 |
+
|
177 |
+
# Set values required in priority: CmdLine, ConfigFile, Default
|
178 |
+
# First, get the location of the virtual environment, it might not be
|
179 |
+
# VenvExecDir if specified on the command line.
|
180 |
+
if ($VenvDir) {
|
181 |
+
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
182 |
+
}
|
183 |
+
else {
|
184 |
+
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
185 |
+
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
186 |
+
Write-Verbose "VenvDir=$VenvDir"
|
187 |
+
}
|
188 |
+
|
189 |
+
# Next, read the `pyvenv.cfg` file to determine any required value such
|
190 |
+
# as `prompt`.
|
191 |
+
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
192 |
+
|
193 |
+
# Next, set the prompt from the command line, or the config file, or
|
194 |
+
# just use the name of the virtual environment folder.
|
195 |
+
if ($Prompt) {
|
196 |
+
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
197 |
+
}
|
198 |
+
else {
|
199 |
+
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
200 |
+
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
201 |
+
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
202 |
+
$Prompt = $pyvenvCfg['prompt'];
|
203 |
+
}
|
204 |
+
else {
|
205 |
+
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
|
206 |
+
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
207 |
+
$Prompt = Split-Path -Path $venvDir -Leaf
|
208 |
+
}
|
209 |
+
}
|
210 |
+
|
211 |
+
Write-Verbose "Prompt = '$Prompt'"
|
212 |
+
Write-Verbose "VenvDir='$VenvDir'"
|
213 |
+
|
214 |
+
# Deactivate any currently active virtual environment, but leave the
|
215 |
+
# deactivate function in place.
|
216 |
+
deactivate -nondestructive
|
217 |
+
|
218 |
+
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
219 |
+
# that there is an activated venv.
|
220 |
+
$env:VIRTUAL_ENV = $VenvDir
|
221 |
+
|
222 |
+
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
223 |
+
|
224 |
+
Write-Verbose "Setting prompt to '$Prompt'"
|
225 |
+
|
226 |
+
# Set the prompt to include the env name
|
227 |
+
# Make sure _OLD_VIRTUAL_PROMPT is global
|
228 |
+
function global:_OLD_VIRTUAL_PROMPT { "" }
|
229 |
+
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
230 |
+
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
231 |
+
|
232 |
+
function global:prompt {
|
233 |
+
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
234 |
+
_OLD_VIRTUAL_PROMPT
|
235 |
+
}
|
236 |
+
$env:VIRTUAL_ENV_PROMPT = $Prompt
|
237 |
+
}
|
238 |
+
|
239 |
+
# Clear PYTHONHOME
|
240 |
+
if (Test-Path -Path Env:PYTHONHOME) {
|
241 |
+
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
242 |
+
Remove-Item -Path Env:PYTHONHOME
|
243 |
+
}
|
244 |
+
|
245 |
+
# Add the venv to the PATH
|
246 |
+
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
247 |
+
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
testgeminicode/bin/activate
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# This file must be used with "source bin/activate" *from bash*
|
2 |
+
# you cannot run it directly
|
3 |
+
|
4 |
+
deactivate () {
|
5 |
+
# reset old environment variables
|
6 |
+
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
|
7 |
+
PATH="${_OLD_VIRTUAL_PATH:-}"
|
8 |
+
export PATH
|
9 |
+
unset _OLD_VIRTUAL_PATH
|
10 |
+
fi
|
11 |
+
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
|
12 |
+
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
|
13 |
+
export PYTHONHOME
|
14 |
+
unset _OLD_VIRTUAL_PYTHONHOME
|
15 |
+
fi
|
16 |
+
|
17 |
+
# This should detect bash and zsh, which have a hash command that must
|
18 |
+
# be called to get it to forget past commands. Without forgetting
|
19 |
+
# past commands the $PATH changes we made may not be respected
|
20 |
+
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
|
21 |
+
hash -r 2> /dev/null
|
22 |
+
fi
|
23 |
+
|
24 |
+
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
|
25 |
+
PS1="${_OLD_VIRTUAL_PS1:-}"
|
26 |
+
export PS1
|
27 |
+
unset _OLD_VIRTUAL_PS1
|
28 |
+
fi
|
29 |
+
|
30 |
+
unset VIRTUAL_ENV
|
31 |
+
unset VIRTUAL_ENV_PROMPT
|
32 |
+
if [ ! "${1:-}" = "nondestructive" ] ; then
|
33 |
+
# Self destruct!
|
34 |
+
unset -f deactivate
|
35 |
+
fi
|
36 |
+
}
|
37 |
+
|
38 |
+
# unset irrelevant variables
|
39 |
+
deactivate nondestructive
|
40 |
+
|
41 |
+
VIRTUAL_ENV="/home/padoa/GEMINI/testgeminicode"
|
42 |
+
export VIRTUAL_ENV
|
43 |
+
|
44 |
+
_OLD_VIRTUAL_PATH="$PATH"
|
45 |
+
PATH="$VIRTUAL_ENV/bin:$PATH"
|
46 |
+
export PATH
|
47 |
+
|
48 |
+
# unset PYTHONHOME if set
|
49 |
+
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
50 |
+
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
51 |
+
if [ -n "${PYTHONHOME:-}" ] ; then
|
52 |
+
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
|
53 |
+
unset PYTHONHOME
|
54 |
+
fi
|
55 |
+
|
56 |
+
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
|
57 |
+
_OLD_VIRTUAL_PS1="${PS1:-}"
|
58 |
+
PS1="(testgeminicode) ${PS1:-}"
|
59 |
+
export PS1
|
60 |
+
VIRTUAL_ENV_PROMPT="(testgeminicode) "
|
61 |
+
export VIRTUAL_ENV_PROMPT
|
62 |
+
fi
|
63 |
+
|
64 |
+
# This should detect bash and zsh, which have a hash command that must
|
65 |
+
# be called to get it to forget past commands. Without forgetting
|
66 |
+
# past commands the $PATH changes we made may not be respected
|
67 |
+
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
|
68 |
+
hash -r 2> /dev/null
|
69 |
+
fi
|
testgeminicode/bin/activate.csh
ADDED
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# This file must be used with "source bin/activate.csh" *from csh*.
|
2 |
+
# You cannot run it directly.
|
3 |
+
# Created by Davide Di Blasi <[email protected]>.
|
4 |
+
# Ported to Python 3.3 venv by Andrew Svetlov <[email protected]>
|
5 |
+
|
6 |
+
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate'
|
7 |
+
|
8 |
+
# Unset irrelevant variables.
|
9 |
+
deactivate nondestructive
|
10 |
+
|
11 |
+
setenv VIRTUAL_ENV "/home/padoa/GEMINI/testgeminicode"
|
12 |
+
|
13 |
+
set _OLD_VIRTUAL_PATH="$PATH"
|
14 |
+
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
|
15 |
+
|
16 |
+
|
17 |
+
set _OLD_VIRTUAL_PROMPT="$prompt"
|
18 |
+
|
19 |
+
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
|
20 |
+
set prompt = "(testgeminicode) $prompt"
|
21 |
+
setenv VIRTUAL_ENV_PROMPT "(testgeminicode) "
|
22 |
+
endif
|
23 |
+
|
24 |
+
alias pydoc python -m pydoc
|
25 |
+
|
26 |
+
rehash
|
testgeminicode/bin/activate.fish
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# This file must be used with "source <venv>/bin/activate.fish" *from fish*
|
2 |
+
# (https://fishshell.com/); you cannot run it directly.
|
3 |
+
|
4 |
+
function deactivate -d "Exit virtual environment and return to normal shell environment"
|
5 |
+
# reset old environment variables
|
6 |
+
if test -n "$_OLD_VIRTUAL_PATH"
|
7 |
+
set -gx PATH $_OLD_VIRTUAL_PATH
|
8 |
+
set -e _OLD_VIRTUAL_PATH
|
9 |
+
end
|
10 |
+
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
|
11 |
+
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
|
12 |
+
set -e _OLD_VIRTUAL_PYTHONHOME
|
13 |
+
end
|
14 |
+
|
15 |
+
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
|
16 |
+
set -e _OLD_FISH_PROMPT_OVERRIDE
|
17 |
+
# prevents error when using nested fish instances (Issue #93858)
|
18 |
+
if functions -q _old_fish_prompt
|
19 |
+
functions -e fish_prompt
|
20 |
+
functions -c _old_fish_prompt fish_prompt
|
21 |
+
functions -e _old_fish_prompt
|
22 |
+
end
|
23 |
+
end
|
24 |
+
|
25 |
+
set -e VIRTUAL_ENV
|
26 |
+
set -e VIRTUAL_ENV_PROMPT
|
27 |
+
if test "$argv[1]" != "nondestructive"
|
28 |
+
# Self-destruct!
|
29 |
+
functions -e deactivate
|
30 |
+
end
|
31 |
+
end
|
32 |
+
|
33 |
+
# Unset irrelevant variables.
|
34 |
+
deactivate nondestructive
|
35 |
+
|
36 |
+
set -gx VIRTUAL_ENV "/home/padoa/GEMINI/testgeminicode"
|
37 |
+
|
38 |
+
set -gx _OLD_VIRTUAL_PATH $PATH
|
39 |
+
set -gx PATH "$VIRTUAL_ENV/bin" $PATH
|
40 |
+
|
41 |
+
# Unset PYTHONHOME if set.
|
42 |
+
if set -q PYTHONHOME
|
43 |
+
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
|
44 |
+
set -e PYTHONHOME
|
45 |
+
end
|
46 |
+
|
47 |
+
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
|
48 |
+
# fish uses a function instead of an env var to generate the prompt.
|
49 |
+
|
50 |
+
# Save the current fish_prompt function as the function _old_fish_prompt.
|
51 |
+
functions -c fish_prompt _old_fish_prompt
|
52 |
+
|
53 |
+
# With the original prompt function renamed, we can override with our own.
|
54 |
+
function fish_prompt
|
55 |
+
# Save the return status of the last command.
|
56 |
+
set -l old_status $status
|
57 |
+
|
58 |
+
# Output the venv prompt; color taken from the blue of the Python logo.
|
59 |
+
printf "%s%s%s" (set_color 4B8BBE) "(testgeminicode) " (set_color normal)
|
60 |
+
|
61 |
+
# Restore the return status of the previous command.
|
62 |
+
echo "exit $old_status" | .
|
63 |
+
# Output the original/"old" prompt.
|
64 |
+
_old_fish_prompt
|
65 |
+
end
|
66 |
+
|
67 |
+
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
|
68 |
+
set -gx VIRTUAL_ENV_PROMPT "(testgeminicode) "
|
69 |
+
end
|
testgeminicode/bin/celery
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from celery.__main__ import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
testgeminicode/bin/dateparser-download
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from dateparser_cli.cli import entrance
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(entrance())
|
testgeminicode/bin/f2py
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from numpy.f2py.f2py2e import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
testgeminicode/bin/flask
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from flask.cli import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
testgeminicode/bin/normalizer
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from charset_normalizer.cli import cli_detect
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(cli_detect())
|
testgeminicode/bin/numpy-config
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from numpy._configtool import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
testgeminicode/bin/pip
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from pip._internal.cli.main import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
testgeminicode/bin/pip3
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from pip._internal.cli.main import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
testgeminicode/bin/pip3.10
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from pip._internal.cli.main import main
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(main())
|
testgeminicode/bin/pyrsa-decrypt
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from rsa.cli import decrypt
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(decrypt())
|
testgeminicode/bin/pyrsa-encrypt
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from rsa.cli import encrypt
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(encrypt())
|
testgeminicode/bin/pyrsa-keygen
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from rsa.cli import keygen
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(keygen())
|
testgeminicode/bin/pyrsa-priv2pub
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from rsa.util import private_to_public
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(private_to_public())
|
testgeminicode/bin/pyrsa-sign
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from rsa.cli import sign
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(sign())
|
testgeminicode/bin/pyrsa-verify
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from rsa.cli import verify
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(verify())
|
testgeminicode/bin/python
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:caec073da847da0ba8e22059a61a877b38b25e0454c2d83520dea2b25c88bbec
|
3 |
+
size 5941832
|
testgeminicode/bin/python3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:caec073da847da0ba8e22059a61a877b38b25e0454c2d83520dea2b25c88bbec
|
3 |
+
size 5941832
|
testgeminicode/bin/python3.10
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:caec073da847da0ba8e22059a61a877b38b25e0454c2d83520dea2b25c88bbec
|
3 |
+
size 5941832
|
testgeminicode/bin/scapy
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/home/padoa/GEMINI/testgeminicode/bin/python
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
import re
|
4 |
+
import sys
|
5 |
+
from scapy.main import interact
|
6 |
+
if __name__ == '__main__':
|
7 |
+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
8 |
+
sys.exit(interact())
|