Packages

phoenix_kit

1.7.200
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib phoenix_kit migrations postgres v143.ex
Raw

lib/phoenix_kit/migrations/postgres/v143.ex

defmodule PhoenixKit.Migrations.Postgres.V143 do
@moduledoc """
V143: Known-device history for new-login security alerts.
`phoenix_kit_user_known_devices` remembers the (IP, hashed user-agent)
pairs a user has previously signed in from. `PhoenixKitWeb.Users.Auth
.log_in_user/3` checks this table on every login; an unrecognized pair
is a "new device" and — when the `new_login_alert_enabled` setting is
on — logs a `user.new_login_detected` activity entry and sends an email
via `PhoenixKit.Users.Auth.UserNotifier.deliver_new_login_alert/2`.
The user agent is stored pre-hashed (SHA-256 hex, matching
`PhoenixKit.Utils.SessionFingerprint.hash_user_agent/1`) — the raw UA
string is never persisted, only enough to recognize a repeat visit from
the same browser/OS combination.
"""
use Ecto.Migration
alias PhoenixKit.Migrations.Postgres.Helpers
def up(opts) do
prefix = Map.get(opts, :prefix, "public")
p = prefix_str(prefix)
create_if_not_exists table(:phoenix_kit_user_known_devices,
primary_key: false,
prefix: prefix
) do
add(:uuid, :uuid, primary_key: true, default: fragment(Helpers.uuid_v7_call(prefix)))
add(
:user_uuid,
references(:phoenix_kit_users,
column: :uuid,
type: :uuid,
on_delete: :delete_all,
prefix: prefix
),
null: false
)
add(:ip_address, :string, size: 45, null: false)
add(:user_agent_hash, :string, size: 64, null: false)
add(:browser, :string, size: 100)
add(:os, :string, size: 100)
add(:first_seen_at, :utc_datetime, null: false, default: fragment("now()"))
add(:last_seen_at, :utc_datetime, null: false, default: fragment("now()"))
end
create_if_not_exists(index(:phoenix_kit_user_known_devices, [:user_uuid], prefix: prefix))
create_if_not_exists(
unique_index(
:phoenix_kit_user_known_devices,
[:user_uuid, :ip_address, :user_agent_hash],
prefix: prefix,
name: "phoenix_kit_known_devices_user_ip_ua_index"
)
)
execute("COMMENT ON TABLE #{p}phoenix_kit IS '143'")
end
def down(opts) do
prefix = Map.get(opts, :prefix, "public")
p = prefix_str(prefix)
drop_if_exists(table(:phoenix_kit_user_known_devices, prefix: prefix))
execute("COMMENT ON TABLE #{p}phoenix_kit IS '142'")
end
defp prefix_str("public"), do: "public."
defp prefix_str(prefix), do: "#{prefix}."
end