Production hardening: security fixes, code quality, 724 skills complete

- Fix 25 shell=True subprocess calls with list-based commands
- Fix 49 verify=False in defensive skills (env-var override)
- Add timeout to 231 HTTP/subprocess/socket calls
- Fix 6 SQL injection patterns with whitelist validation
- Replace 8 __import__() with standard imports
- Remove 701 unused imports across 442 files
- Add authorized-testing disclaimers to all offensive skills
- Complete 11 incomplete skill directories
- Expand 10 stub SKILL.md files with full content
- Fix 2 YAML parse errors in frontmatter
- Fix 5 pre-existing syntax errors
- Convert 22 hardcoded paths/ports to environment variables
- Back up 21 redundant skill pairs to .bak
- Fix 2 global declaration errors
- 724/724 skills with full folder anatomy (SKILL.md + agent.py + api-reference.md + LICENSE)
- 0 compile errors across all 724 agent.py files
This commit is contained in:
mukul975
2026-03-19 13:26:49 +01:00
parent 63b442d347
commit c47eed6a64
900 changed files with 23085 additions and 2720 deletions
@@ -28,7 +28,7 @@ class SecretServerClient:
data = {"grant_type": "password", "username": username, "password": password}
if domain:
data["domain"] = domain
resp = self.session.post(url, data=data)
resp = self.session.post(url, data=data, timeout=30)
resp.raise_for_status()
return resp.json()["access_token"]
@@ -41,13 +41,13 @@ class SecretServerClient:
params["filter.folderId"] = folder_id
if secret_template_id:
params["filter.secretTemplateId"] = secret_template_id
resp = self.session.get(f"{self.base_url}/api/v1/secrets", params=params)
resp = self.session.get(f"{self.base_url}/api/v1/secrets", params=params, timeout=30)
resp.raise_for_status()
return resp.json().get("records", [])
def get_secret(self, secret_id):
"""Retrieve a secret by ID."""
resp = self.session.get(f"{self.base_url}/api/v1/secrets/{secret_id}")
resp = self.session.get(f"{self.base_url}/api/v1/secrets/{secret_id}", timeout=30)
resp.raise_for_status()
return resp.json()
@@ -56,13 +56,13 @@ class SecretServerClient:
items = [{"fieldId": fid, "itemValue": val} for fid, val in fields.items()]
data = {"name": name, "secretTemplateId": template_id,
"folderId": folder_id, "items": items}
resp = self.session.post(f"{self.base_url}/api/v1/secrets", json=data)
resp = self.session.post(f"{self.base_url}/api/v1/secrets", json=data, timeout=30)
resp.raise_for_status()
return resp.json()
def get_secret_templates(self):
"""List available secret templates."""
resp = self.session.get(f"{self.base_url}/api/v1/secret-templates")
resp = self.session.get(f"{self.base_url}/api/v1/secret-templates", timeout=30)
resp.raise_for_status()
return resp.json().get("records", [])
@@ -71,46 +71,46 @@ class SecretServerClient:
params = {}
if parent_id:
params["filter.parentFolderId"] = parent_id
resp = self.session.get(f"{self.base_url}/api/v1/folders", params=params)
resp = self.session.get(f"{self.base_url}/api/v1/folders", params=params, timeout=30)
resp.raise_for_status()
return resp.json().get("records", [])
def rotate_secret_password(self, secret_id):
"""Trigger password rotation for a secret (Remote Password Changing)."""
resp = self.session.post(
f"{self.base_url}/api/v1/secrets/{secret_id}/change-password")
f"{self.base_url}/api/v1/secrets/{secret_id}/change-password", timeout=30)
resp.raise_for_status()
return resp.json()
def get_secret_audit(self, secret_id):
"""Get audit trail for a specific secret."""
resp = self.session.get(f"{self.base_url}/api/v1/secrets/{secret_id}/audits")
resp = self.session.get(f"{self.base_url}/api/v1/secrets/{secret_id}/audits", timeout=30)
resp.raise_for_status()
return resp.json().get("records", [])
def checkout_secret(self, secret_id):
"""Check out a secret for exclusive access."""
resp = self.session.post(
f"{self.base_url}/api/v1/secrets/{secret_id}/check-out")
f"{self.base_url}/api/v1/secrets/{secret_id}/check-out", timeout=30)
resp.raise_for_status()
return resp.json()
def checkin_secret(self, secret_id):
"""Check in a previously checked-out secret."""
resp = self.session.post(
f"{self.base_url}/api/v1/secrets/{secret_id}/check-in")
f"{self.base_url}/api/v1/secrets/{secret_id}/check-in", timeout=30)
resp.raise_for_status()
return resp.json()
def get_users(self):
"""List all users."""
resp = self.session.get(f"{self.base_url}/api/v1/users")
resp = self.session.get(f"{self.base_url}/api/v1/users", timeout=30)
resp.raise_for_status()
return resp.json().get("records", [])
def get_roles(self):
"""List all roles."""
resp = self.session.get(f"{self.base_url}/api/v1/roles")
resp = self.session.get(f"{self.base_url}/api/v1/roles", timeout=30)
resp.raise_for_status()
return resp.json().get("records", [])