bug fix: make sure free scan works

This commit is contained in:
usmannasir
2025-06-26 21:26:30 +05:00
parent 52a0ea3d1a
commit 32622cf2d1

View File

@@ -237,7 +237,31 @@ class AIScannerManager:
# Field doesn't exist yet, allow access for now
pass
# Get scanner settings
# Check VPS free scans availability first
server_ip = ACLManager.fetchIP()
vps_info = self.check_vps_free_scans(server_ip)
# If VPS is eligible for free scans, get or create API key
vps_api_key = None
vps_key_data = None
if (vps_info.get('success') and
vps_info.get('is_vps') and
vps_info.get('free_scans_available', 0) > 0):
self.logger.writeToFile(f'[AIScannerManager.startScan] VPS eligible for free scans, getting API key for IP: {server_ip}')
vps_key_data = self.get_or_create_vps_api_key(server_ip)
if vps_key_data:
vps_api_key = vps_key_data.get('api_key')
free_scans_remaining = vps_key_data.get('free_scans_remaining', 0)
self.logger.writeToFile(f'[AIScannerManager.startScan] VPS API key obtained, {free_scans_remaining} free scans remaining')
else:
self.logger.writeToFile(f'[AIScannerManager.startScan] Failed to get VPS API key')
return JsonResponse({'success': False, 'error': 'Failed to authenticate VPS for free scans'})
# Get scanner settings (only required if not using VPS free scan)
scanner_settings = None
if not vps_api_key:
try:
scanner_settings = AIScannerSettings.objects.get(admin=admin)
if not scanner_settings.is_payment_configured or not scanner_settings.api_key:
@@ -277,7 +301,6 @@ class AIScannerManager:
scan_type=scan_type,
status='pending'
)
server_ip = ACLManager.fetchIP()
# Create file access token
FileAccessToken.objects.create(
@@ -291,8 +314,12 @@ class AIScannerManager:
# Submit scan to AI Scanner API
callback_url = f"https://{request.get_host()}/api/ai-scanner/callback"
file_access_base_url = f"https://{request.get_host()}/api/ai-scanner/"
# Use VPS API key if available, otherwise use regular scanner settings
api_key_to_use = vps_api_key if vps_api_key else scanner_settings.api_key
scan_response = self.submit_wordpress_scan(
scanner_settings.api_key,
api_key_to_use,
domain,
scan_type,
callback_url,
@@ -306,10 +333,16 @@ class AIScannerManager:
scan_history.status = 'running'
scan_history.save()
# Create appropriate success message
if vps_api_key:
message = f'Free VPS scan started successfully! {vps_key_data.get("free_scans_remaining", 0)} free scans remaining.'
else:
message = 'Scan started successfully'
return JsonResponse({
'success': True,
'scan_id': scan_id,
'message': 'Scan started successfully'
'message': message
})
else:
scan_history.status = 'failed'
@@ -758,6 +791,43 @@ class AIScannerManager:
self.logger.writeToFile(f'[AIScannerManager.setup_add_payment_method] Exception: {str(e)}')
return None
def get_or_create_vps_api_key(self, server_ip):
"""Get API key for VPS free scans from platform"""
try:
payload = {'server_ip': server_ip}
self.logger.writeToFile(f'[AIScannerManager.get_or_create_vps_api_key] Requesting VPS API key for IP: {server_ip}')
response = requests.post(
f'{self.AI_SCANNER_API_BASE}/api/vps/generate-api-key/',
json=payload,
headers={'Content-Type': 'application/json'},
timeout=10
)
self.logger.writeToFile(f'[AIScannerManager.get_or_create_vps_api_key] Response status: {response.status_code}')
self.logger.writeToFile(f'[AIScannerManager.get_or_create_vps_api_key] Response content: {response.text}')
if response.status_code == 200:
data = response.json()
if data.get('success'):
return {
'api_key': data.get('api_key'),
'free_scans_remaining': data.get('free_scans_remaining'),
'account_type': data.get('account_type'),
'vps_name': data.get('vps_name'),
'vps_id': data.get('vps_id')
}
else:
self.logger.writeToFile(f'[AIScannerManager.get_or_create_vps_api_key] API returned success=false: {data.get("error", "Unknown error")}')
else:
self.logger.writeToFile(f'[AIScannerManager.get_or_create_vps_api_key] Non-200 status code: {response.status_code}')
return None
except Exception as e:
self.logger.writeToFile(f'[AIScannerManager.get_or_create_vps_api_key] Exception: {str(e)}')
return None
def generate_file_access_token(self):
"""Generate secure file access token"""
return f'cp_{secrets.token_urlsafe(32)}'