From a33f081abc80a05506d11c692ae863f2d0ee81ed Mon Sep 17 00:00:00 2001
From: Bastien Le Querrec <blq@laquadrature.net>
Date: Fri, 21 Jun 2024 16:16:37 +0200
Subject: [PATCH] =?UTF-8?q?Attrap:=20plus=20besoin=20du=20controlport=20de?=
 =?UTF-8?q?=20Tor=20pour=20changer=20d'identit=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 Attrap.py        | 35 +++++++++++++----------------------
 Dockerfile-base  |  3 +--
 README.md        |  8 --------
 requirements.txt |  1 -
 4 files changed, 14 insertions(+), 33 deletions(-)

diff --git a/Attrap.py b/Attrap.py
index f8c788c..478eeec 100644
--- a/Attrap.py
+++ b/Attrap.py
@@ -1,8 +1,10 @@
 import os
 import re
+import random
 import ssl
 import subprocess
 import shutil
+import string
 import logging
 import requests
 import time
@@ -25,9 +27,6 @@ from pypdf import PdfReader
 from pypdf import PdfWriter
 from pypdf.generic import NameObject, NumberObject
 
-from stem import Signal
-from stem.control import Controller
-
 import hashlib
 import smtplib
 import email
@@ -153,6 +152,7 @@ class Attrap:
         self.tor_enabled = False
         self.tor_max_requests = 0
         self.tor_requests = 0
+        self.tor_socks5_key = None
         self.not_before = datetime.datetime(2024, 1, 1)
         self.smtp_configured = False
         self.mastodon = None
@@ -189,14 +189,8 @@ class Attrap:
 
     def enable_tor(self, max_requests=0):
         """Active l'utilisation de Tor pour effectuer les requêtes."""
-        proxies = {
-            "http": f"socks5h://127.0.0.1:9050",
-            "https": f"socks5h://127.0.0.1:9050",
-        }
         self.tor_enabled = True
         self.tor_max_requests = max_requests
-        self.tor_requests = 0
-        self.session.proxies.update(proxies)
         self.tor_get_new_id()
 
     def disable_tor(self):
@@ -208,18 +202,15 @@ class Attrap:
         self.session.proxies.update(proxies)
 
     def tor_get_new_id(self):
-        """Change d'identité Tor. Cela permet de changer de noeud de sortie donc d'IP."""
+        """Change de circuit Tor. Cela permet de changer de noeud de sortie donc d'IP."""
         if self.tor_enabled:
-            logger.info('Changement d\'identité Tor')
-            try:
-                self.session.close()
-                controller = Controller.from_port(port=9051)
-                controller.authenticate()
-                controller.signal(Signal.NEWNYM)
-                time.sleep(5)
-                self.tor_requests = 0
-            except Exception as exc:
-                logger.debug(f'Impossible de changer d\'identité Tor: {exc}')
+            self.tor_socks5_key = 'attrap_' + ''.join(random.choices(string.ascii_lowercase, k=20))
+            proxies = {
+                "http": f"socks5h://attrap:{self.tor_socks5_key}@127.0.0.1:9050",
+                "https": f"socks5h://attrap:{self.tor_socks5_key}@127.0.0.1:9050",
+            }
+            self.session.proxies.update(proxies)
+            self.tor_requests = 0
 
     def get_sub_pages(self, page_content, element, host, recursive_until_pdf):
         """
@@ -455,7 +446,7 @@ class Attrap:
             if page.status_code == 429:
                 logger.warning('Erreur 429 Too Many Requests reçue, temporisation...')
                 self.tor_get_new_id()
-                time.sleep(55)
+                time.sleep(1)
                 return self.get_page(url, method, data)
 
             if self.tor_enabled:
@@ -468,7 +459,7 @@ class Attrap:
         except requests.exceptions.ConnectionError:
             logger.warning(f'Erreur de connexion, temporisation...')
             self.tor_get_new_id()
-            time.sleep(55)
+            time.sleep(30)
             return self.get_page(url, method, data)
         except requests.exceptions.Timeout:
             logger.warning(f'Timeout, on relance la requête...')
diff --git a/Dockerfile-base b/Dockerfile-base
index d3ecee8..bef978b 100644
--- a/Dockerfile-base
+++ b/Dockerfile-base
@@ -8,5 +8,4 @@ RUN apt-get update && \
 	apt-get install --no-install-recommends -y python3 python3-virtualenv chromium-driver make xauth xvfb tesseract-ocr tesseract-ocr-eng tesseract-ocr-fra curl unzip zip tor file ghostscript && \
 	apt-get clean && \
 	rm -rf /var/lib/apt/lists && \
-	ln -s /usr/bin/python3 /usr/bin/python && \
-	sed -i '/^#ControlPort 9051/s/^#//' /etc/tor/torrc
+	ln -s /usr/bin/python3 /usr/bin/python
diff --git a/README.md b/README.md
index 2011c87..3c4337b 100644
--- a/README.md
+++ b/README.md
@@ -18,14 +18,6 @@ pip3 install -r requirements.txt
 
 Vous devez avoir installé les données `eng` et `fra` de Tesseract et le démon Tor.
 
-### Configuration du démon Tor
-
-Il faut que le port de contrôle 9051 du démon Tor soit ouvert pour permettre à Attrap de s'y connecter. Vous pouvez exécuter la ligne suivante pour faire cela :
-
-```bash
-sed -i '/^#ControlPort 9051/s/^#//' /etc/tor/torrc
-```
-
 ## Utilisation
 
 Pour lancer la récupération de toutes les administrations supportées :
diff --git a/requirements.txt b/requirements.txt
index efe28e5..bd604ec 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,4 +8,3 @@ pypdf>=4.2.0
 PyVirtualDisplay>=3.0
 requests>=2.31.0
 selenium>=4.19.0
-stem>=1.8.2
-- 
GitLab