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 users auth known_device.ex
Raw

lib/phoenix_kit/users/auth/known_device.ex

defmodule PhoenixKit.Users.Auth.KnownDevice do
@moduledoc """
A device (IP + hashed user-agent) a user has previously logged in from.
Backs the new-login security alert: a login whose `(ip_address,
user_agent_hash)` pair has no matching row for the user is a "new
device" and — when `new_login_alert_enabled` is on — triggers
`user.new_login_detected` in the activity log plus an email via
`PhoenixKit.Users.Auth.UserNotifier.deliver_new_login_alert/2`.
The user agent is stored pre-hashed (SHA-256 hex, via
`PhoenixKit.Utils.SessionFingerprint.hash_user_agent/1`) — the raw UA
string is never persisted.
"""
use Ecto.Schema
use PhoenixKit.SchemaPrefix
alias PhoenixKit.Users.Auth.User
@primary_key {:uuid, UUIDv7, autogenerate: true}
schema "phoenix_kit_user_known_devices" do
field :ip_address, :string
field :user_agent_hash, :string
field :browser, :string
field :os, :string
field :location, :string
field :first_seen_at, :utc_datetime
field :last_seen_at, :utc_datetime
belongs_to :user, User, foreign_key: :user_uuid, references: :uuid, type: UUIDv7
end
@doc false
def changeset(known_device, attrs) do
known_device
|> Ecto.Changeset.cast(attrs, [
:user_uuid,
:ip_address,
:user_agent_hash,
:browser,
:os,
:location,
:first_seen_at,
:last_seen_at
])
|> Ecto.Changeset.validate_required([
:user_uuid,
:ip_address,
:user_agent_hash,
:first_seen_at,
:last_seen_at
])
|> Ecto.Changeset.unique_constraint([:user_uuid, :ip_address, :user_agent_hash],
name: :phoenix_kit_known_devices_user_ip_ua_index
)
end
end