larxius commited on
Commit
ee7b305
·
verified ·
1 Parent(s): 0d7f954

Update backend_structured/models.py

Browse files
Files changed (1) hide show
  1. 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