Implement comprehensive admin interface allowing designated superusers to view all users and organizations, impersonate users for debugging, and perform administrative operations. All superuser actions are tracked in audit logs for compliance. Features: - Superuser authentication with dedicated admin routes at /admin - User impersonation with session state preservation - Admin dashboard with system statistics - User and organization management interfaces - Comprehensive audit logging with IP tracking - Visual impersonation banner with exit capability - Security controls preventing self-impersonation and superuser-to-superuser impersonation Database: - Add is_superuser boolean field to users table - Create audit_logs table for tracking sensitive operations - Set graham@mcintire.me as initial superuser
109 lines
3.4 KiB
Elixir
109 lines
3.4 KiB
Elixir
defmodule Towerops.MixProject do
|
|
use Mix.Project
|
|
|
|
def project do
|
|
[
|
|
app: :towerops,
|
|
version: "0.1.0",
|
|
elixir: "~> 1.15",
|
|
elixirc_paths: elixirc_paths(Mix.env()),
|
|
start_permanent: Mix.env() == :prod,
|
|
aliases: aliases(),
|
|
deps: deps(),
|
|
compilers: [:phoenix_live_view] ++ Mix.compilers(),
|
|
listeners: [Phoenix.CodeReloader],
|
|
dialyzer: dialyzer()
|
|
]
|
|
end
|
|
|
|
# Configuration for the OTP application.
|
|
#
|
|
# Type `mix help compile.app` for more information.
|
|
def application do
|
|
[
|
|
mod: {Towerops.Application, []},
|
|
extra_applications: [:logger, :runtime_tools, :os_mon]
|
|
]
|
|
end
|
|
|
|
def cli do
|
|
[
|
|
preferred_envs: [precommit: :test]
|
|
]
|
|
end
|
|
|
|
# Specifies which paths to compile per environment.
|
|
defp elixirc_paths(:test), do: ["lib", "test/support"]
|
|
defp elixirc_paths(_), do: ["lib"]
|
|
|
|
# Specifies your project dependencies.
|
|
#
|
|
# Type `mix help deps` for examples and options.
|
|
defp deps do
|
|
[
|
|
{:bcrypt_elixir, "~> 3.0"},
|
|
{:phoenix, "~> 1.8.3"},
|
|
{:phoenix_ecto, "~> 4.5"},
|
|
{:ecto_sql, "~> 3.13"},
|
|
{:postgrex, ">= 0.0.0"},
|
|
{:phoenix_html, "~> 4.1"},
|
|
{:phoenix_live_reload, "~> 1.2", only: :dev},
|
|
{:phoenix_live_view, "~> 1.1.0"},
|
|
{:lazy_html, ">= 0.1.0", only: :test},
|
|
{:phoenix_live_dashboard, "~> 0.8.3"},
|
|
{:esbuild, "~> 0.10", runtime: Mix.env() == :dev},
|
|
{:tailwind, "~> 0.3", runtime: Mix.env() == :dev},
|
|
{:heroicons,
|
|
github: "tailwindlabs/heroicons", tag: "v2.2.0", sparse: "optimized", app: false, compile: false, depth: 1},
|
|
{:swoosh, "~> 1.16"},
|
|
{:req, "~> 0.5"},
|
|
{:snmpkit, "~> 1.3"},
|
|
{:yaml_elixir, "~> 2.9"},
|
|
{:telemetry_metrics, "~> 1.0"},
|
|
{:telemetry_poller, "~> 1.0"},
|
|
{:gettext, "~> 1.0"},
|
|
{:jason, "~> 1.2"},
|
|
{:dns_cluster, "~> 0.2.0"},
|
|
{:libcluster, "~> 3.4"},
|
|
{:bandit, "~> 1.5"},
|
|
{:ecto_psql_extras, "~> 0.6"},
|
|
{:mox, "~> 1.0", only: :test},
|
|
{:styler, "~> 1.10", only: [:dev, :test], runtime: false},
|
|
{:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false},
|
|
{:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false},
|
|
{:credo, "~> 1.7", only: [:dev, :test], runtime: false}
|
|
]
|
|
end
|
|
|
|
# Dialyzer configuration for static analysis
|
|
defp dialyzer do
|
|
[
|
|
plt_file: {:no_warn, "priv/plts/dialyzer.plt"},
|
|
plt_add_apps: [:mix, :ex_unit],
|
|
flags: [:unmatched_returns, :error_handling, :unknown]
|
|
]
|
|
end
|
|
|
|
# Aliases are shortcuts or tasks specific to the current project.
|
|
# For example, to install project dependencies and perform other setup tasks, run:
|
|
#
|
|
# $ mix setup
|
|
#
|
|
# See the documentation for `Mix` for more info on aliases.
|
|
defp aliases do
|
|
[
|
|
setup: ["deps.get", "ecto.setup", "assets.setup", "assets.build"],
|
|
"ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"],
|
|
"ecto.reset": ["ecto.drop", "ecto.setup"],
|
|
test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"],
|
|
"assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
|
|
"assets.build": ["compile", "tailwind towerops", "esbuild towerops"],
|
|
"assets.deploy": [
|
|
"tailwind towerops --minify",
|
|
"esbuild towerops --minify",
|
|
"phx.digest"
|
|
],
|
|
precommit: ["compile --warnings-as-errors", "deps.unlock --unused", "format", "test"]
|
|
]
|
|
end
|
|
end
|