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.
- aiwaf/__init__.py +1 -1
- aiwaf/blacklist_manager.py +17 -4
- aiwaf/management/commands/add_exemption.py +30 -0
- aiwaf/management/commands/clear_cache.py +18 -0
- aiwaf/management/commands/diagnose_blocking.py +96 -0
- aiwaf/management/commands/setup_models.py +35 -0
- aiwaf/management/commands/test_exemption.py +120 -0
- aiwaf/management/commands/test_exemption_fix.py +54 -0
- aiwaf/middleware.py +28 -16
- aiwaf/middleware_logger.py +66 -106
- aiwaf/models.py +28 -1
- aiwaf/storage.py +166 -360
- aiwaf/trainer.py +0 -12
- {aiwaf-0.1.9.0.4.dist-info → aiwaf-0.1.9.0.6.dist-info}/METADATA +30 -27
- aiwaf-0.1.9.0.6.dist-info/RECORD +32 -0
- aiwaf/management/commands/debug_csv.py +0 -155
- aiwaf-0.1.9.0.4.dist-info/RECORD +0 -27
- {aiwaf-0.1.9.0.4.dist-info → aiwaf-0.1.9.0.6.dist-info}/WHEEL +0 -0
- {aiwaf-0.1.9.0.4.dist-info → aiwaf-0.1.9.0.6.dist-info}/licenses/LICENSE +0 -0
- {aiwaf-0.1.9.0.4.dist-info → aiwaf-0.1.9.0.6.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aiwaf
|
|
3
|
-
Version: 0.1.9.0.
|
|
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
|
|
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
|
|
101
|
+
Optional middleware logger that captures requests to Django models:
|
|
102
102
|
- **Automatic fallback** when main access logs unavailable
|
|
103
|
-
- **
|
|
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
|
-
###
|
|
224
|
+
### Database Models
|
|
225
225
|
|
|
226
|
-
|
|
226
|
+
AI-WAF uses Django models for real-time, high-performance storage:
|
|
227
227
|
|
|
228
228
|
```python
|
|
229
|
-
#
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
#
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
**
|
|
238
|
-
- No
|
|
239
|
-
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
- **
|
|
280
|
-
- **Zero configuration** - trainer automatically detects and uses
|
|
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
|
|
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
|
|
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")
|
aiwaf-0.1.9.0.4.dist-info/RECORD
DELETED
|
@@ -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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|