- Fix CLOAK_KEY placeholder in nix shell (invalid base64) - Fix error HTML test assertion to match actual template - Fix Gaiia sync: read 'subnet' field instead of 'block' for IP blocks - Fix Gaiia sync: extract nested status name from subscription objects - Fix security headers tests for environment detection - Fix mobile auth tests to use raw_token - Fix LiveView test assertions to match actual template content - Fix SNMP config test expectations for test environment - Refactor: resolve all Credo complexity/nesting issues - Extract helper functions in NetBox sync, VISP sync, Sonar sync - Flatten nested conditionals in settings, integrations, alerts - Use with/validate_present pattern for connection testing
44 lines
1.3 KiB
Elixir
44 lines
1.3 KiB
Elixir
defmodule ToweropsWeb.Plugs.SecurityHeaders do
|
|
@moduledoc """
|
|
Adds security headers to all responses.
|
|
|
|
Headers added:
|
|
- Content-Security-Policy: Restricts resource loading to prevent XSS
|
|
- X-Frame-Options: Prevents clickjacking attacks
|
|
- X-Content-Type-Options: Prevents MIME type sniffing
|
|
- Referrer-Policy: Controls referrer information leakage
|
|
- Permissions-Policy: Disables browsing-topics API
|
|
"""
|
|
|
|
import Plug.Conn
|
|
|
|
def init(opts), do: opts
|
|
|
|
def call(conn, _opts) do
|
|
if Application.get_env(:towerops, :env) == :prod do
|
|
conn
|
|
|> put_resp_header("permissions-policy", "browsing-topics=()")
|
|
|> put_resp_header("content-security-policy", csp_header())
|
|
|> put_resp_header("x-frame-options", "SAMEORIGIN")
|
|
|> put_resp_header("x-content-type-options", "nosniff")
|
|
|> put_resp_header("referrer-policy", "strict-origin-when-cross-origin")
|
|
else
|
|
conn
|
|
end
|
|
end
|
|
|
|
defp csp_header do
|
|
Enum.join(
|
|
[
|
|
"default-src 'self'",
|
|
"script-src 'self' 'unsafe-inline' 'unsafe-eval'",
|
|
"style-src 'self' 'unsafe-inline' 'unsafe-hashes'",
|
|
"img-src 'self' data: https:",
|
|
"font-src 'self' data:",
|
|
"connect-src 'self' ws: wss:",
|
|
"frame-ancestors 'self'"
|
|
],
|
|
"; "
|
|
)
|
|
end
|
|
end
|