Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
Update backend_structured/models.py
Browse files- backend_structured/models.py +34 -0
backend_structured/models.py
CHANGED
|
@@ -138,6 +138,16 @@ class User(db.Model):
|
|
| 138 |
locked_until = db.Column(db.DateTime, nullable=True)
|
| 139 |
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
| 140 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 141 |
scans = db.relationship('Scan', backref='user', lazy=True, cascade="all, delete-orphan")
|
| 142 |
alert_settings = db.relationship('AlertSettings', backref='user', uselist=False, lazy=True, cascade="all, delete-orphan")
|
| 143 |
|
|
@@ -215,6 +225,13 @@ class Scan(db.Model):
|
|
| 215 |
scan_options = db.Column(db.JSON, nullable=True) # crawl_depth, exclude_paths, enable_red_team
|
| 216 |
ssl_info = db.Column(db.JSON, nullable=True) # Cached SSL certificate info
|
| 217 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
vulnerabilities = db.relationship('Vulnerability', backref='scan', lazy=True, cascade="all, delete-orphan")
|
| 219 |
|
| 220 |
def __init__(self, org_id, user_id, target_url, scan_type='Full', status='queued', security_score=None, started_at=None, completed_at=None, auth_headers=None, scan_options=None, id=None):
|
|
@@ -252,6 +269,10 @@ class Vulnerability(db.Model):
|
|
| 252 |
owasp_category = db.Column(db.String(100), nullable=True)
|
| 253 |
exploit_poc = db.Column(db.JSON, nullable=True)
|
| 254 |
remediation_code = db.Column(db.Text, nullable=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
|
| 256 |
def __init__(self, scan_id, title, severity, category, description, remediation, cvss_score, detected_at=None, id=None, evidence="", payload="", request_details="", response_details="", cwe_ids=None, owasp_category=None, exploit_poc=None, remediation_code=None):
|
| 257 |
if id: self.id = id
|
|
@@ -378,4 +399,17 @@ class OrganizationScanQuota(db.Model):
|
|
| 378 |
__table_args__ = (db.UniqueConstraint('org_id', 'scan_type', name='uix_org_scan_type'),)
|
| 379 |
|
| 380 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 381 |
|
|
|
|
| 138 |
locked_until = db.Column(db.DateTime, nullable=True)
|
| 139 |
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
| 140 |
|
| 141 |
+
# Policy Consent & Security Fields
|
| 142 |
+
terms_accepted_at = db.Column(db.DateTime, nullable=True)
|
| 143 |
+
privacy_policy_agreed_at = db.Column(db.DateTime, nullable=True)
|
| 144 |
+
policy_version_agreed = db.Column(db.String(20), default='v1.0')
|
| 145 |
+
mfa_enabled = db.Column(db.Boolean, default=False)
|
| 146 |
+
mfa_secret = db.Column(db.String(100), nullable=True)
|
| 147 |
+
reset_token = db.Column(db.String(255), nullable=True)
|
| 148 |
+
reset_token_expires = db.Column(db.DateTime, nullable=True)
|
| 149 |
+
email_verified = db.Column(db.Boolean, default=False)
|
| 150 |
+
|
| 151 |
scans = db.relationship('Scan', backref='user', lazy=True, cascade="all, delete-orphan")
|
| 152 |
alert_settings = db.relationship('AlertSettings', backref='user', uselist=False, lazy=True, cascade="all, delete-orphan")
|
| 153 |
|
|
|
|
| 225 |
scan_options = db.Column(db.JSON, nullable=True) # crawl_depth, exclude_paths, enable_red_team
|
| 226 |
ssl_info = db.Column(db.JSON, nullable=True) # Cached SSL certificate info
|
| 227 |
|
| 228 |
+
duration_seconds = db.Column(db.Integer, nullable=True)
|
| 229 |
+
error_message = db.Column(db.Text, nullable=True)
|
| 230 |
+
critical_count = db.Column(db.Integer, default=0)
|
| 231 |
+
high_count = db.Column(db.Integer, default=0)
|
| 232 |
+
medium_count = db.Column(db.Integer, default=0)
|
| 233 |
+
low_count = db.Column(db.Integer, default=0)
|
| 234 |
+
|
| 235 |
vulnerabilities = db.relationship('Vulnerability', backref='scan', lazy=True, cascade="all, delete-orphan")
|
| 236 |
|
| 237 |
def __init__(self, org_id, user_id, target_url, scan_type='Full', status='queued', security_score=None, started_at=None, completed_at=None, auth_headers=None, scan_options=None, id=None):
|
|
|
|
| 269 |
owasp_category = db.Column(db.String(100), nullable=True)
|
| 270 |
exploit_poc = db.Column(db.JSON, nullable=True)
|
| 271 |
remediation_code = db.Column(db.Text, nullable=True)
|
| 272 |
+
|
| 273 |
+
status = db.Column(db.String(50), nullable=False, default='open') # open, in_progress, resolved, ignored
|
| 274 |
+
remediated_at = db.Column(db.DateTime, nullable=True)
|
| 275 |
+
remediated_by = db.Column(db.String(36), nullable=True)
|
| 276 |
|
| 277 |
def __init__(self, scan_id, title, severity, category, description, remediation, cvss_score, detected_at=None, id=None, evidence="", payload="", request_details="", response_details="", cwe_ids=None, owasp_category=None, exploit_poc=None, remediation_code=None):
|
| 278 |
if id: self.id = id
|
|
|
|
| 399 |
__table_args__ = (db.UniqueConstraint('org_id', 'scan_type', name='uix_org_scan_type'),)
|
| 400 |
|
| 401 |
|
| 402 |
+
class Report(db.Model):
|
| 403 |
+
__tablename__ = 'reports'
|
| 404 |
+
def __init__(self, **kwargs): super().__init__(**kwargs)
|
| 405 |
+
|
| 406 |
+
id = db.Column(db.String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
|
| 407 |
+
scan_id = db.Column(db.String(36), db.ForeignKey('scans.id', ondelete='CASCADE'), nullable=False)
|
| 408 |
+
org_id = db.Column(db.String(36), db.ForeignKey('organizations.id', ondelete='CASCADE'), nullable=False)
|
| 409 |
+
report_type = db.Column(db.String(50), nullable=False) # pdf, executive_summary, compliance
|
| 410 |
+
file_path = db.Column(db.String(500), nullable=True)
|
| 411 |
+
generated_at = db.Column(db.DateTime, default=datetime.utcnow)
|
| 412 |
+
|
| 413 |
+
|
| 414 |
+
|
| 415 |
|