changeset 40:17a1cf5af6f7

Add bot detection
author Lewin Bormann <lbo@spheniscida.de>
date Mon, 18 Jul 2022 08:03:07 -0700
parents 43cd5bbe858e
children 0534f0e4ea7d
files schema/log_sqlite.sql src/logsdb.rs src/main.rs
diffstat 3 files changed, 9 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/schema/log_sqlite.sql	Sat Jul 16 17:38:00 2022 -0700
+++ b/schema/log_sqlite.sql	Mon Jul 18 08:03:07 2022 -0700
@@ -8,6 +8,8 @@
 
     origin_country TEXT,
     origin_city TEXT,
+
+    is_bot integer,
 );
 
 DROP TABLE IF EXISTS RequestLog;
--- a/src/logsdb.rs	Sat Jul 16 17:38:00 2022 -0700
+++ b/src/logsdb.rs	Mon Jul 18 08:03:07 2022 -0700
@@ -77,17 +77,19 @@
         &mut self,
         domain: &str,
         orig: Option<(String, String)>,
+        is_bot: bool,
     ) -> Result<u32, Error> {
         let (country, city) = orig.unwrap_or((Default::default(), Default::default()));
         Ok(sqlx::query(
             r#"
-INSERT INTO Sessions (start, last, domain, origin_country, origin_city)
-VALUES (strftime('%s', 'now'), strftime('%s', 'now'), ?, ?, ?)
+INSERT INTO Sessions (start, last, domain, origin_country, origin_city, is_bot)
+VALUES (strftime('%s', 'now'), strftime('%s', 'now'), ?, ?, ?, ?)
 RETURNING id"#,
         )
         .bind(domain)
         .bind(country)
         .bind(city)
+        .bind(is_bot)
         .fetch_one(&mut *self.0)
         .await?
         .get(0))
--- a/src/main.rs	Sat Jul 16 17:38:00 2022 -0700
+++ b/src/main.rs	Mon Jul 18 08:03:07 2022 -0700
@@ -352,12 +352,14 @@
 
         let sip = ip.to_string();
         let sip = headers.0.get_one("x-real-ip").unwrap_or(&sip);
+        let ua = headers.0.get_one("user-agent").unwrap_or("");
         let numip = IpAddr::from_str(sip).unwrap_or(ip);
 
         if session_id.is_none() {
             let orig = geoipdb.as_ref().and_then(|g| g.lookup(numip));
+            let is_bot = ua.to_lowercase().contains("bot");
             match conn
-                .start_session(host.as_ref().map(String::as_str).unwrap_or(""), orig)
+                .start_session(host.as_ref().map(String::as_str).unwrap_or(""), orig, is_bot)
                 .await
             {
                 Ok(id) => {
@@ -372,7 +374,6 @@
         }
 
         let ntags = tags.len() as u32;
-        let ua = headers.0.get_one("user-agent").unwrap_or("");
         let host: String = host.unwrap_or(
             headers
                 .0