aiwaf 0.1.9.0.4__py3-none-any.whl → 0.1.9.0.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of aiwaf might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aiwaf
3
- Version: 0.1.9.0.4
3
+ Version: 0.1.9.0.6
4
4
  Summary: AI-powered Web Application Firewall
5
5
  Home-page: https://github.com/aayushgauba/aiwaf
6
6
  Author: Aayush Gauba
@@ -68,7 +68,7 @@ aiwaf/
68
68
  ## 🚀 Features
69
69
 
70
70
  - **IP Blocklist**
71
- Instantly blocks suspicious IPs (supports CSV fallback or Django model).
71
+ Instantly blocks suspicious IPs using Django models with real-time performance.
72
72
 
73
73
  - **Rate Limiting**
74
74
  Sliding‑window blocks flooders (> `AIWAF_RATE_MAX` per `AIWAF_RATE_WINDOW`), then blacklists them.
@@ -98,9 +98,9 @@ aiwaf/
98
98
  Blocks guessed or invalid UUIDs that don't resolve to real models.
99
99
 
100
100
  - **Built-in Request Logger**
101
- Optional middleware logger that captures requests to CSV:
101
+ Optional middleware logger that captures requests to Django models:
102
102
  - **Automatic fallback** when main access logs unavailable
103
- - **CSV format** for easy analysis and training
103
+ - **Real-time storage** in database for instant access
104
104
  - **Captures response times** for better anomaly detection
105
105
  - **Zero configuration** - works out of the box
106
106
 
@@ -221,28 +221,33 @@ AIWAF_ACCESS_LOG = "/var/log/nginx/access.log"
221
221
 
222
222
  ---
223
223
 
224
- ### Storage Configuration
224
+ ### Database Models
225
225
 
226
- **Choose storage backend:**
226
+ AI-WAF uses Django models for real-time, high-performance storage:
227
227
 
228
228
  ```python
229
- # Use Django models (default) - requires database tables
230
- AIWAF_STORAGE_MODE = "models"
231
-
232
- # OR use CSV files - no database required
233
- AIWAF_STORAGE_MODE = "csv"
234
- AIWAF_CSV_DATA_DIR = "aiwaf_data" # Directory for CSV files
229
+ # All data is stored in Django models - no configuration needed
230
+ # Tables created automatically with migrations:
231
+ # - aiwaf_blacklistentry # Blocked IP addresses
232
+ # - aiwaf_ipexemption # Exempt IP addresses
233
+ # - aiwaf_dynamickeyword # Dynamic keywords with counts
234
+ # - aiwaf_featuresample # Feature samples for ML training
235
+ # - aiwaf_requestlog # Request logs (if middleware logging enabled)
235
236
  ```
236
237
 
237
- **CSV Mode Features:**
238
- - No database migrations required
239
- - Files stored in `aiwaf_data/` directory:
240
- - `blacklist.csv` - Blocked IP addresses
241
- - `exemptions.csv` - Exempt IP addresses
242
- - `keywords.csv` - Dynamic keywords
243
- - `access_samples.csv` - Feature samples for ML training
244
- - Perfect for lightweight deployments or when you prefer file-based storage
245
- - Management commands work identically in both modes
238
+ **Benefits of Django Models:**
239
+ - ⚡ **Real-time performance** - No file I/O bottlenecks
240
+ - 🔄 **Instant updates** - Changes visible immediately across all processes
241
+ - 🚀 **Better concurrency** - No file locking issues
242
+ - 📊 **Rich querying** - Use Django ORM for complex operations
243
+ - 🔍 **Admin integration** - View/manage data through Django admin
244
+
245
+ **Database Setup:**
246
+ ```bash
247
+ # Create and apply migrations
248
+ python manage.py makemigrations aiwaf
249
+ python manage.py migrate aiwaf
250
+ ```
246
251
 
247
252
  ---
248
253
 
@@ -253,8 +258,6 @@ Enable AI-WAF's built-in request logger as a fallback when main access logs aren
253
258
  ```python
254
259
  # Enable middleware logging
255
260
  AIWAF_MIDDLEWARE_LOGGING = True # Enable/disable logging
256
- AIWAF_MIDDLEWARE_LOG = "aiwaf_requests.log" # Log file path
257
- AIWAF_MIDDLEWARE_CSV = True # Use CSV format (recommended)
258
261
  ```
259
262
 
260
263
  **Then add middleware to MIDDLEWARE list:**
@@ -276,8 +279,8 @@ python manage.py aiwaf_logging --clear # Clear log files
276
279
 
277
280
  **Benefits:**
278
281
  - **Automatic fallback** when `AIWAF_ACCESS_LOG` unavailable
279
- - **CSV format** with precise timestamps and response times
280
- - **Zero configuration** - trainer automatically detects and uses CSV logs
282
+ - **Database storage** with precise timestamps and response times
283
+ - **Zero configuration** - trainer automatically detects and uses model logs
281
284
  - **Lightweight** - fails silently to avoid breaking your application
282
285
 
283
286
  ---
@@ -386,7 +389,7 @@ python manage.py detect_and_train
386
389
  ```
387
390
 
388
391
  ### What happens:
389
- 1. Read access logs (incl. rotated or gzipped) **OR** AI-WAF middleware CSV logs
392
+ 1. Read access logs (incl. rotated or gzipped) **OR** AI-WAF middleware model logs
390
393
  2. Auto‑block IPs with ≥ 6 total 404s
391
394
  3. Extract features & train IsolationForest
392
395
  4. Save `model.pkl` with current scikit-learn version
@@ -411,7 +414,7 @@ python manage.py detect_and_train
411
414
  5. Extract top 10 dynamic keywords from 4xx/5xx
412
415
  6. Remove any keywords associated with newly exempt paths
413
416
 
414
- **Note:** If main access log (`AIWAF_ACCESS_LOG`) is unavailable, trainer automatically falls back to AI-WAF middleware CSV logs.
417
+ **Note:** If main access log (`AIWAF_ACCESS_LOG`) is unavailable, trainer automatically falls back to AI-WAF middleware model logs.
415
418
 
416
419
  ---
417
420
 
@@ -0,0 +1,32 @@
1
+ aiwaf/__init__.py,sha256=CaCYDiHa_an8eS3dgJs0d6bCNQN7KUMc2sJBLEXNt8I,220
2
+ aiwaf/apps.py,sha256=nCez-Ptlv2kaEk5HenA8b1pATz1VfhrHP1344gwcY1A,142
3
+ aiwaf/blacklist_manager.py,sha256=LYCeKFB-7e_C6Bg2WeFJWFIIQlrfRMPuGp30ivrnhQY,1196
4
+ aiwaf/decorators.py,sha256=IUKOdM_gdroffImRZep1g1wT6gNqD10zGwcp28hsJCs,825
5
+ aiwaf/middleware.py,sha256=uKGelYd7SLB37BMcR7SQ_83NIPy6n2Y17ZvTOFpAOWM,12262
6
+ aiwaf/middleware_logger.py,sha256=LWZVDAnjh6CGESirA8eMbhGgJKB7lVDGRQqVroH95Lo,4742
7
+ aiwaf/models.py,sha256=vQxgY19BDVMjoO903UNrTZC1pNoLltMU6wbyWPoAEns,2719
8
+ aiwaf/storage.py,sha256=z2QjAySa95FN3SPJL2GBL11tE8JYrAH6mB7BMSZ6GEM,7310
9
+ aiwaf/trainer.py,sha256=dOjdQ5zqEuwzffgTu7WZMokFcW5b0-KTDSjMeHBcIhw,9203
10
+ aiwaf/utils.py,sha256=BJk5vJCYdGPl_4QQiknjhCbkzv5HZCXgFcBJDMJpHok,3390
11
+ aiwaf/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ aiwaf/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ aiwaf/management/commands/add_exemption.py,sha256=U_ByfJw1EstAZ8DaSoRb97IGwYzXs0DBJkVAqeN4Wak,1128
14
+ aiwaf/management/commands/add_ipexemption.py,sha256=srgdVPDJtF7G9GGIqaZ7L3qTuNheoS_uwlhlRO4W2bc,945
15
+ aiwaf/management/commands/aiwaf_diagnose.py,sha256=nXFRhq66N4QC3e4scYJ2sUngJce-0yDxtBO3R2BllRM,6134
16
+ aiwaf/management/commands/aiwaf_logging.py,sha256=FCIqULn2tii2vD9VxL7vk3PV4k4vr7kaA00KyaCExYY,7692
17
+ aiwaf/management/commands/aiwaf_reset.py,sha256=0FIBqpZS8xgFFvAKJ-0zAC_-QNQwRkOHpXb8N-OdFr8,3740
18
+ aiwaf/management/commands/clear_cache.py,sha256=cdnuTgxkhKLqT_6k6yTcEBlREovNRQxAE51ceXlGYMA,647
19
+ aiwaf/management/commands/detect_and_train.py,sha256=-o-LZ7QZ5GeJPCekryox1DGXKMmFEkwwrcDsiM166K0,269
20
+ aiwaf/management/commands/diagnose_blocking.py,sha256=HKb_FdN4b6QdyqNDf54B08I5jyWfrv9Mh-SFBrr3LbU,4140
21
+ aiwaf/management/commands/regenerate_model.py,sha256=SUy7TCTTDJy4kRZNAbTIVBxSmljUaAC6ms0JTfSO6BE,3445
22
+ aiwaf/management/commands/setup_models.py,sha256=JzuxwAqO3e-8L4PdFlXkyEQmOA8EGCXBfaOwfCNv1Gg,1678
23
+ aiwaf/management/commands/test_exemption.py,sha256=qX7GMnpGFhRzC8cTtJMVN7pvjXziEWJ934cyOLN3cqs,5511
24
+ aiwaf/management/commands/test_exemption_fix.py,sha256=ngyGaHUCmQQ6y--6j4q1viZJtR-RvI526yDqvEaEXPs,2553
25
+ aiwaf/resources/model.pkl,sha256=5t6h9BX8yoh2xct85MXOO60jdlWyg1APskUOW0jZE1Y,1288265
26
+ aiwaf/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ aiwaf/templatetags/aiwaf_tags.py,sha256=XXfb7Tl4DjU3Sc40GbqdaqOEtKTUKELBEk58u83wBNw,357
28
+ aiwaf-0.1.9.0.6.dist-info/licenses/LICENSE,sha256=Ir8PX4dxgAcdB0wqNPIkw84fzIIRKE75NoUil9RX0QU,1069
29
+ aiwaf-0.1.9.0.6.dist-info/METADATA,sha256=xhkKJlK7aW0mObUkrIboi4E4GTP1aLpyoo_I0QUJs4E,13763
30
+ aiwaf-0.1.9.0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
31
+ aiwaf-0.1.9.0.6.dist-info/top_level.txt,sha256=kU6EyjobT6UPCxuWpI_BvcHDG0I2tMgKaPlWzVxe2xI,6
32
+ aiwaf-0.1.9.0.6.dist-info/RECORD,,
@@ -1,155 +0,0 @@
1
- from django.core.management.base import BaseCommand
2
- import os
3
- import csv
4
-
5
- class Command(BaseCommand):
6
- help = 'Debug and fix AI-WAF CSV functionality'
7
-
8
- def add_arguments(self, parser):
9
- parser.add_argument(
10
- '--test-ip',
11
- type=str,
12
- help='Test IP address to add to exemption list',
13
- default='127.0.0.1'
14
- )
15
- parser.add_argument(
16
- '--fix',
17
- action='store_true',
18
- help='Attempt to fix identified issues',
19
- )
20
-
21
- def handle(self, *args, **options):
22
- self.stdout.write(self.style.HTTP_INFO("🔍 AI-WAF CSV Debug & Fix"))
23
- self.stdout.write("")
24
-
25
- # Check storage mode
26
- from django.conf import settings
27
- storage_mode = getattr(settings, 'AIWAF_STORAGE_MODE', 'models')
28
- csv_dir = getattr(settings, 'AIWAF_CSV_DATA_DIR', 'aiwaf_data')
29
-
30
- self.stdout.write(f"Storage Mode: {storage_mode}")
31
- self.stdout.write(f"CSV Directory: {csv_dir}")
32
- self.stdout.write("")
33
-
34
- # Check middleware logging
35
- middleware_logging = getattr(settings, 'AIWAF_MIDDLEWARE_LOGGING', False)
36
- middleware_log = getattr(settings, 'AIWAF_MIDDLEWARE_LOG', 'aiwaf_requests.log')
37
-
38
- self.stdout.write(f"Middleware Logging: {middleware_logging}")
39
- self.stdout.write(f"Middleware Log File: {middleware_log}")
40
- self.stdout.write("")
41
-
42
- # Check if CSV directory exists
43
- if os.path.exists(csv_dir):
44
- self.stdout.write(self.style.SUCCESS(f"✅ CSV directory exists: {csv_dir}"))
45
- else:
46
- self.stdout.write(self.style.ERROR(f"❌ CSV directory missing: {csv_dir}"))
47
- if options['fix']:
48
- os.makedirs(csv_dir, exist_ok=True)
49
- self.stdout.write(self.style.SUCCESS(f"✅ Created CSV directory: {csv_dir}"))
50
-
51
- # Check CSV files
52
- csv_files = ['blacklist.csv', 'exemptions.csv', 'keywords.csv']
53
- for filename in csv_files:
54
- filepath = os.path.join(csv_dir, filename)
55
- if os.path.exists(filepath):
56
- # Count entries
57
- try:
58
- with open(filepath, 'r', newline='', encoding='utf-8') as f:
59
- reader = csv.reader(f)
60
- rows = list(reader)
61
- entry_count = len(rows) - 1 if rows else 0 # Subtract header
62
- self.stdout.write(self.style.SUCCESS(f"✅ {filename}: {entry_count} entries"))
63
- except Exception as e:
64
- self.stdout.write(self.style.ERROR(f"❌ {filename}: Error reading - {e}"))
65
- else:
66
- self.stdout.write(self.style.WARNING(f"⚠️ {filename}: Not found"))
67
-
68
- self.stdout.write("")
69
-
70
- # Test storage functionality
71
- self.stdout.write(self.style.HTTP_INFO("🧪 Testing Storage Functions"))
72
-
73
- try:
74
- from aiwaf.storage import get_exemption_store, get_blacklist_store, get_keyword_store
75
-
76
- # Test exemption store
77
- exemption_store = get_exemption_store()
78
- self.stdout.write(f"Exemption Store: {exemption_store.__name__}")
79
-
80
- # Test blacklist store
81
- blacklist_store = get_blacklist_store()
82
- self.stdout.write(f"Blacklist Store: {blacklist_store.__name__}")
83
-
84
- # Test keyword store
85
- keyword_store = get_keyword_store()
86
- self.stdout.write(f"Keyword Store: {keyword_store.__name__}")
87
-
88
- except Exception as e:
89
- self.stdout.write(self.style.ERROR(f"❌ Storage import failed: {e}"))
90
- return
91
-
92
- self.stdout.write("")
93
-
94
- # Test exemption functionality
95
- test_ip = options['test_ip']
96
- self.stdout.write(f"🧪 Testing exemption with IP: {test_ip}")
97
-
98
- try:
99
- # Check if already exempted
100
- is_exempted_before = exemption_store.is_exempted(test_ip)
101
- self.stdout.write(f"Before: IP {test_ip} exempted = {is_exempted_before}")
102
-
103
- # Add to exemption
104
- exemption_store.add_ip(test_ip, "Test exemption from debug command")
105
- self.stdout.write(f"✅ Added {test_ip} to exemption list")
106
-
107
- # Check if now exempted
108
- is_exempted_after = exemption_store.is_exempted(test_ip)
109
- self.stdout.write(f"After: IP {test_ip} exempted = {is_exempted_after}")
110
-
111
- if is_exempted_after:
112
- self.stdout.write(self.style.SUCCESS("✅ Exemption functionality working!"))
113
- else:
114
- self.stdout.write(self.style.ERROR("❌ Exemption functionality not working!"))
115
-
116
- # List all exemptions
117
- all_exemptions = exemption_store.get_all()
118
- self.stdout.write(f"Total exemptions: {len(all_exemptions)}")
119
-
120
- for exemption in all_exemptions:
121
- self.stdout.write(f" - {exemption.get('ip_address', exemption)}")
122
-
123
- except Exception as e:
124
- self.stdout.write(self.style.ERROR(f"❌ Exemption test failed: {e}"))
125
-
126
- self.stdout.write("")
127
-
128
- # Check middleware logger file
129
- csv_log_file = middleware_log.replace('.log', '.csv')
130
- if os.path.exists(csv_log_file):
131
- try:
132
- with open(csv_log_file, 'r', newline='', encoding='utf-8') as f:
133
- reader = csv.reader(f)
134
- rows = list(reader)
135
- entry_count = len(rows) - 1 if rows else 0
136
- self.stdout.write(self.style.SUCCESS(f"✅ Middleware CSV log: {entry_count} entries"))
137
- except Exception as e:
138
- self.stdout.write(self.style.ERROR(f"❌ Middleware CSV log error: {e}"))
139
- else:
140
- self.stdout.write(self.style.WARNING(f"⚠️ Middleware CSV log not found: {csv_log_file}"))
141
- self.stdout.write(" Make some requests to generate log entries")
142
-
143
- # Recommendations
144
- self.stdout.write("")
145
- self.stdout.write(self.style.HTTP_INFO("💡 Recommendations:"))
146
-
147
- if storage_mode != 'csv':
148
- self.stdout.write("1. Set AIWAF_STORAGE_MODE = 'csv' in settings.py")
149
-
150
- if not middleware_logging:
151
- self.stdout.write("2. Set AIWAF_MIDDLEWARE_LOGGING = True in settings.py")
152
-
153
- self.stdout.write("3. Add AIWAFLoggerMiddleware to MIDDLEWARE in settings.py")
154
- self.stdout.write("4. Make some requests to generate log data")
155
- self.stdout.write("5. Run 'python manage.py detect_and_train' to train with data")
@@ -1,27 +0,0 @@
1
- aiwaf/__init__.py,sha256=w99RK2Yc4N5TICgJLmsEL_DOiNe7LoCy5GZMkf1t_hQ,220
2
- aiwaf/apps.py,sha256=nCez-Ptlv2kaEk5HenA8b1pATz1VfhrHP1344gwcY1A,142
3
- aiwaf/blacklist_manager.py,sha256=92ltIrFfv8WOC4CXwvNVZYfivkRZHGNg3E2QAbHQipQ,550
4
- aiwaf/decorators.py,sha256=IUKOdM_gdroffImRZep1g1wT6gNqD10zGwcp28hsJCs,825
5
- aiwaf/middleware.py,sha256=fajFXsETb2kGQJzHi7cEV3bQA88yqHbZvRDPNR1y2OA,11188
6
- aiwaf/middleware_logger.py,sha256=v5tsiFhfdFTDBRRsfw-vfmhW2sNJx7EYRem99pgMsP0,6858
7
- aiwaf/models.py,sha256=XaG1pd_oZu3y-fw66u4wblGlWcUY9gvsTNKGD0kQk7Y,1672
8
- aiwaf/storage.py,sha256=Gh92OCE52j9d8vjBQCoJbjA5-fsMQkdbYYypJMuZjtQ,14167
9
- aiwaf/trainer.py,sha256=Cem-qi1KMjfw7MFDxyxjn7nAJGPrk-I8An4HHniiT00,9877
10
- aiwaf/utils.py,sha256=BJk5vJCYdGPl_4QQiknjhCbkzv5HZCXgFcBJDMJpHok,3390
11
- aiwaf/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- aiwaf/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- aiwaf/management/commands/add_ipexemption.py,sha256=srgdVPDJtF7G9GGIqaZ7L3qTuNheoS_uwlhlRO4W2bc,945
14
- aiwaf/management/commands/aiwaf_diagnose.py,sha256=nXFRhq66N4QC3e4scYJ2sUngJce-0yDxtBO3R2BllRM,6134
15
- aiwaf/management/commands/aiwaf_logging.py,sha256=FCIqULn2tii2vD9VxL7vk3PV4k4vr7kaA00KyaCExYY,7692
16
- aiwaf/management/commands/aiwaf_reset.py,sha256=0FIBqpZS8xgFFvAKJ-0zAC_-QNQwRkOHpXb8N-OdFr8,3740
17
- aiwaf/management/commands/debug_csv.py,sha256=Vp55g1qWAuRUuAHoz56nuPxMrcccFCHKRGeYyui8Pxw,6794
18
- aiwaf/management/commands/detect_and_train.py,sha256=-o-LZ7QZ5GeJPCekryox1DGXKMmFEkwwrcDsiM166K0,269
19
- aiwaf/management/commands/regenerate_model.py,sha256=SUy7TCTTDJy4kRZNAbTIVBxSmljUaAC6ms0JTfSO6BE,3445
20
- aiwaf/resources/model.pkl,sha256=5t6h9BX8yoh2xct85MXOO60jdlWyg1APskUOW0jZE1Y,1288265
21
- aiwaf/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- aiwaf/templatetags/aiwaf_tags.py,sha256=XXfb7Tl4DjU3Sc40GbqdaqOEtKTUKELBEk58u83wBNw,357
23
- aiwaf-0.1.9.0.4.dist-info/licenses/LICENSE,sha256=Ir8PX4dxgAcdB0wqNPIkw84fzIIRKE75NoUil9RX0QU,1069
24
- aiwaf-0.1.9.0.4.dist-info/METADATA,sha256=PtBnfHANxkOI4buUl8kQqglCgzXjGR2dtC6IZdJSEKc,13571
25
- aiwaf-0.1.9.0.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
26
- aiwaf-0.1.9.0.4.dist-info/top_level.txt,sha256=kU6EyjobT6UPCxuWpI_BvcHDG0I2tMgKaPlWzVxe2xI,6
27
- aiwaf-0.1.9.0.4.dist-info/RECORD,,