- [
Pow.Plug.Base
] Will now use the existing:pow_config
in theconn
when no plug options has been set
- [
PowEmailConfirmation.Ecto.Schema
]PowEmailConfirmation.Ecto.Schema.changeset/3
no longer sets the email to the unconfirmed email when the same email change is set twice - [
Pow.Extension.Phoenix.Messages
] Fixed fallback message dializer warning
Now supports Phoenix 1.5, and requires Elixir 1.7 or higher.
- [
Mix.Tasks.Pow.Extension.Phoenix.Gen.Templates
]mix pow.extension.phoenix.gen.templates
now dynamically loads template list from the extension base module - [
PowResetPassword.Plug
]PowResetPassword.Plug.load_user_by_token/2
now sets a:pow_reset_password_decoded_token
key inconn.private
that will be used inPowResetPassword.Plug.update_user_password/2
Warning: This release will now sign and verify all tokens, causing previous tokens to no longer work. Any sessions and persistent sessions will be invalidated.
- [
Pow.Plug.Session
] Now sets a global lock when renewing the session - [
PowPersistentSession.Plug.Cookie
] Now sets a global lock when authenticating the user - [
PowEmailConfirmation.Plug
] AddedPowEmailConfirmation.Plug.sign_confirmation_token/2
to sign theemail_confirmation_token
to prevent timing attacks - [
PowEmailConfirmation.Plug
] AddedPowEmailConfirmation.Plug.load_user_by_token/2
to verify the signedemail_confirmation_token
to prevent timing attacks - [
PowEmailConfirmation.Plug
] AddedPowEmailConfirmation.Plug.confirm_email/2
with map as second argument - [
PowInvitation.Plug
] AddedPowInvitation.Plug.sign_invitation_token/2
to sign theinvitation_token
- [
PowInvitation.Plug
] AddedPowInvitation.Plug.load_invited_user_by_token/2
to verify the signedinvitation_token
to prevent timing attacks - [
PowResetPassword.Plug
] ChangedPowResetPassword.Plug.create_reset_token/2
to sign the:token
- [
PowResetPassword.Plug
] AddedPowResetPassword.Plug.load_user_by_token/2
to verify the signed token to prevent timing attacks - [
PowResetPassword.Plug
] ChangedPowResetPassword.Plug.update_user_password/2
so it decodes the signed token - [
PowPersistentSession.Plug.Cookie
] Now uses signed tokens to prevent timing attacks - [
Pow.Plug.Session
] Now uses signed session ID's to prevent timing attacks - [
Pow.Plug
] AddedPow.Plug.sign_token/4
to sign tokens - [
Pow.Plug
] AddedPow.Plug.verify_token/4
to decode and verify signed tokens - [
Pow.Plug.MessageVerifier
] AddedPow.Plug.MessageVerifier
module to sign and verify messages - [
PowEmailConfirmation.Ecto.Context
] AddedPowEmailConfirmation.Ecto.Context.confirm_email/3
- [
PowEmailConfirmation.Ecto.Schema
] Addedconfirm_email_changeset/2
andpow_confirm_email_changeset/2
to the macro - [
PowEmailConfirmation.Ecto.Schema
] AddedPowEmailConfirmation.Ecto.Schema.confirm_email_changeset/2
- [
PowInvitation.Ecto.Schema
] Addedaccept_invitation_changeset/2
andpow_accept_invitation_changeset/2
to the macro - [
PowResetPassword.Ecto.Schema
] Addedreset_password_changeset/2
andpow_reset_password_changeset/2
to the macro - [
Pow.Ecto.Schema
] Now emits a warning instead of raising error with missing fields/associations
- [
PowEmailConfirmation.Plug
]PowEmailConfirmation.Plug.confirm_email/2
with token param as second argument has been deprecated in favor ofPowEmailConfirmation.Plug.load_user_by_token/2
, andPowEmailConfirmation.Plug.confirm_email/2
with map as second argument - [
PowInvitation.Plug
]PowInvitation.Plug.invited_user_from_token/2
has been deprecated in favor ofPowInvitation.Plug.load_invited_user_by_token/2
- [
PowInvitation.Plug
]PowInvitation.Plug.assign_invited_user/2
has been deprecated - [
PowResetPassword.Plug
]PowResetPassword.Plug.user_from_token/2
has been deprecated in favor ofPowResetPassword.Plug.load_user_by_token/2
- [
PowResetPassword.Plug
]PowResetPassword.Plug.assign_reset_password_user/2
has been deprecated - [
PowEmailConfirmation.Ecto.Context
]PowEmailConfirmation.Ecto.Context.confirm_email/2
deprecated in favor ofPowEmailConfirmation.Ecto.Context.confirm_email/3
- [
PowEmailConfirmation.Ecto.Schema
]PowEmailConfirmation.Ecto.Schema.confirm_email_changeset/1
deprecated in favor ofPowEmailConfirmation.Ecto.Schema.confirm_email_changeset/2
- Updated the API guide with signed tokens
- [
Pow.Phoenix.Routes
] Fixed bug where callback route methods is not using the overridden method - [
PowPersistentSession.Plug.Cookie
]PowPersistentSession.Plug.Cookie.delete/2
now correctly pulls token during:before_send
callback - [
Pow.Plug.Session
]Pow.Plug.Session.delete/2
now correctly pulls session id during:before_send
callback soPowEmailConfirmation
will remove set session
- [
Pow.Ecto.Context
] Calls toPow.Ecto.Context.get_by/2
replaced withPow.Operations.get_by/2
so custom users context module can be used. The following methods has been updated:Pow.Ecto.Context.authenticate/2
PowEmailConfirmation.Ecto.Context.get_by_confirmation_token/2
PowInvitation.Ecto.Context.get_by_invitation_token/2
PowResetPassword.Ecto.Context.get_by_email/2
- [
Pow.Ecto.Schema.Changeset
]Pow.Ecto.Schema.Changeset.confirm_password_changeset/3
now adds the defaultEcto.Changeset.validate_confirmation/3
error instead of the previousnot same as password
error - [
Pow.Ecto.Schema.Changeset
]Pow.Ecto.Schema.Changeset.confirm_password_changeset/3
now uses theEcto.Changeset.validate_confirmation/3
for validation and expects:password_confirmation
instead of:confirm_password
in params - [
Pow.Ecto.Schema.Changeset
]Pow.Ecto.Schema.Changeset.new_password_changeset/3
now only requires the:password_hash
if there have been no previous errors set in the changeset - [
Pow.Ecto.Schema
] No longer adds:confirm_password
virtual field - [
Pow.Ecto.Schema
] Now has an@after_compile
callback that ensures all required fields has been defined - [
PowInvitation.Phoenix.InvitationView
] Now renders:password_confirmation
field instead of:confirm_password
- [
PowResetPassword.Phoenix.ResetPasswordView
] Now renders:password_confirmation
field instead of:confirm_password
- [
Pow.Phoenix.RegistrationView
] Now renders:password_confirmation
field instead of:confirm_password
- [
PowEmailConfirmation.Ecto.Schema
] No longer validates if:email
has been taken before setting:unconfirmed_email
- [
PowEmailConfirmation.Phoenix.ControllerCallbacks
] Now prevents user enumeration forPowInvitation.Phoenix.InvitationController.create/2
- [
PowPersistentSession.Plug.Cookie
] Changed default cookie name topersistent_session
- [
PowPersistentSession.Plug.Cookie
] Removed renewal of cookie as the token will always expire - [
PowPersistentSession.Plug.Cookie
] No longer expires invalid cookies - [
Pow.Operations
] AddedPow.Operations.fetch_primary_key_values/2
- [
PowPersistentSession.Plug.Base
] Now registers:before_send
callbacks - [
PowPersistentSession.Plug.Cookie
] Now updates cookie and backend store in:before_send
callback - [
Pow.Plug.Base
] Now registers:before_send
callbacks - [
Pow.Plug.Session
] Now updates plug session and backend store in:before_send
callback - [
Pow.Plug
] AddedPow.Plug.create/3
- [
Pow.Plug
] AddedPow.Plug.delete/2
- [
PowResetPassword.Phoenix.ResetPasswordController
] Will no longer prevent information leak by checking ifPowEmailConfirmation
or registration routes are enabled; instead it'll by default prevent user enumeration, but can be disabled ifpow_prevent_user_enumeration: false
is set inconn.private
- [
PowPersistentSession.Plug.Base
] With custom:persistent_session_store
now falls back to:cache_store_backend
configuration option - [
PowResetPassword.Plug
] With custom:reset_password_token_store
now falls back to:cache_store_backend
configuration option - [
Pow.Plug.Base
] With custom:credentials_cache_store
now falls back to:cache_store_backend
configuration option
- [
Pow.Ecto.Changeset
]Pow.Ecto.Schema.Changeset.confirm_password_changeset/3
has deprecated use of:confirm_password
in params in favor of:password_confirmation
- [
Pow.Plug.Session
]:session_store
option has been renamed to:credentials_cache_store
- [
Pow.Plug
]Pow.Plug.clear_authenticated_user/1
deprecated in favor ofPow.Plug.delete/1
Note: This release contains an important security fix.
- [
PowPersistentSession.Plug.Cookie
] Now supports:persistent_session_cookie_opts
to customize any options that will be passed on toPlug.Conn.put_resp_cookie/4
- [
PowResetPassword.Phoenix.ResetPasswordController
] Now usesPowResetPassword.Phoenix.Messages.maybe_email_has_been_sent/1
with a generic response that tells the user the email has been sent only if an account was found - [
PowResetPassword.Phoenix.ResetPasswordController
] When a user doesn't exist will now return success message ifPowEmailConfirmation
extension is enabled - [
PowResetPassword.Phoenix.Messages
] AddedPowResetPassword.Phoenix.Messages.maybe_email_has_been_sent/1
and letPowResetPassword.Phoenix.Messages.email_has_been_sent/1
fall back to it - [
PowEmailConfirmation.Phoenix.ControllerCallbacks
] When a user tries to sign up and the email has already been taken the default e-mail confirmation required message will be shown - [
Pow.Plug.Session
] Now renews the Plug session each time the Pow session is created or rolled
- [
Pow.Ecto.Schema.Changeset
] Fixed bug wherePow.Ecto.Schema.Changeset.user_id_field_changeset/3
update withnil
value caused an exception to be raised - [
PowPersistentSession.Plug.Cookie
] Now expires the cookie 10 seconds after the last request when authenticating to prevent multiple simultaneous requests deletes the cookie immediately
- Added mailer rate limitation section to production checklist guide
- [
Pow.Plug.Session
] Added section on session expiration to the docs - Updated instructions in umbrella project guide to Elixir 1.9
- [
Pow.Store.Backend.Base
] Updated usage example with Cachex - Added security practices page
- [
Pow.Extension.Base
] Extensions are now expected to have a base module with compile-time information whether certain modules are available to prevent unnecessaryCode.ensure_compiled?/1
calls:- Added
Pow.Extension.Base
module - Added
PowEmailConfirmation
module - Added
PowInvitation
module - Added
PowPersistentSession
module - Added
PowResetPassword
module
- Added
- [
PowPersistentSession.Plug.Cookie
] Added support for custom metadata:PowPersistentSession.Plug.Cookie.create/3
now stores a metadata keyword list that can be populatedPowPersistentSession.Plug.Cookie.create/3
will now, instead of adding:session_fingerprint
to the metadata, populate the:session_metadata
keyword list with:fingerprint
PowPersistentSession.Plug.Cookie.authenticate/2
will now populate session metadata with what exists in:session_metadata
key for the persistent session metadataPowPersistentSession.Plug.Cookie.create/3
now ensures to delete the previous persistent session first, if one is found in cookies
- [
Pow.Extension.Config
] AddedPow.Extension.Config.extension_modules/2
- [
Router.Phoenix.Router
] Fixed bug where resource routes were not filtered correctly according to the path bindings
- [
Pow.Extension.Config
] DeprecatedPow.Extension.Config.discover_modules/2
- Changed minmum password length to 8 (OWASP/NIST recommendations)
Pow.Phoenix.Router
now only filters routes that has equal number of bindingsPow.Phoenix.Routes.user_not_authenticated_path/1
now only puts the:request_path
param if the request is using "GET" method- The stores has been refactored so the command conforms with ETS store. This means that put commands now accept
{key, value}
record element(s), and keys may be list for easier lookup.Pow.Store.Backend.Base
behaviour now requires to;- Accept
Pow.Store.Backend.Base.record/0
values forput/2
- Accept
Pow.Store.Backend.Base.key/0
fordelete/2
andget/2
- Implement
all/2
- Remove
keys/1
- Remove
put/3
- Accept
Pow.Store.Backend.EtsCache
now uses:ordered_set
instead of:set
for efficiencyPow.Store.Backend.MnesiaCache
now uses:ordered_set
instead of:set
for efficiencyPow.Store.Backend.MnesiaCache
will delete all binary key records when initializedPow.Store.Base
behaviour now requires to;- Accept erlang term value for keys in all methods
- Implement
put/3
instead ofput/4
- Implement
delete/2
instead ofput/3
- Implement
get/2
instead ofput/3
- Remove
keys/2
Pow.Store.Base.all/3
addedPow.Store.Base.put/3
addedPow.Store.Base
will use binary key rather than key list ifall/2
doesn't exist in the backend cache- Added
Pow.Store.CredentialsCache.users/2
- Added
Pow.Store.CredentialsCache.sessions/2
Pow.Store.CredentialsCache
now adds a session key rather than appending to a list for the user key to prevent race condition
Pow.Plug.Session.create/3
now stores a keyword list with metadata for the session rather than just a timestampPow.Plug.Session.fetch/2
andPow.Plug.Session.create/3
now assigns:pow_session_metadata
inconn.private
with the session metadataPow.Plug.Session.create/3
will use the metadata found inconn.private[:pow_session_metadata]
if it exists and otherwise add a randomly unique id for:fingerprint
PowPersistentSession.Plug.Cookie.create/3
will use the value ofconn.private[:pow_session_metadata][:fingerprint]
if it exists as:session_fingerprint
in the persistent session metadataPowPersistentSession.Plug.Cookie.authenticate/2
will assign:fingerprint
toconn.private[:pow_session_metadata]
if it exists in the persistent session metadataPow.Store.CredentialsCache.put/3
will invalidate any other sessions with the same:fingerprint
if any is set in session metadataPowResetPassword.Phoenix.ResetPasswordController.create/2
when a user doesn't exist will now only return success message if the registration routes has been disabled, otherwise the form with an error message will be returned- Added
PowResetPassword.Phoenix.Messages.user_not_found/1
- Fixed bug where
Pow.Store.CredentialsCache
wasn't used due to howPow.Store.Base
macro worked - Fixed bug where
PowEmailConfirmation.Phoenix.ControllerCallbacks
couldn't deliver email
- Deprecated
Pow.Store.Backend.EtsCache.keys/1
- Deprecated
Pow.Store.Backend.EtsCache.put/3
- Deprecated
Pow.Store.Backend.MnesiaCache.keys/1
- Deprecated
Pow.Store.Backend.MnesiaCache.put/3
- Deprecated
Pow.Store.Base.keys/2
- Deprecated
Pow.Store.Base.put/4
- Deprecated
Pow.Store.CredentialsCache.user_session_keys/3
- Deprecated
Pow.Store.CredentialsCache.sessions/3
- Updated
PowEmailConfirmation.Ecto.Schema.changeset/3
so;- when
:email
is identical to:unconfirmed_email
it won't generate new:email_confirmation_token
- when
:email
is identical to the persisted:email
value both:email_confirmation_token
and:unconfirmed_email
will be set tonil
- when there is no
:email
value in the params nothing happens
- when
- Updated
PowEmailConfirmation.Ecto.Schema.confirm_email_changeset/1
so now:email_confirmation_token
is set tonil
- Updated
Pow.Ecto.Schema.Changeset.user_id_field_changeset/3
so the e-mail validator now accepts unicode e-mails - Added
PowEmailConfirmation.Ecto.Context.current_email_unconfirmed?/2
andPowEmailConfirmation.Plug.pending_email_change?/1
- Added
:email_validator
configuration option toPow.Ecto.Schema.Changeset
- Added
Pow.Ecto.Schema.Changeset.validate_email/1
- Fixed bug in
PowEmailConfirmation.Phoenix.ControllerCallbacks.send_confirmation_email/2
where the confirmation e-mail wasn't send to the updated e-mail address
- Added API integration guide
- Added
:reset_password_token_store
configuration setting - To prevent timing attacks,
Pow.Ecto.Context.authenticate/2
now verifies password on a blank user struct when no user can be found for the provided user id, but will always return nil. The blank user struct has a nil:password_hash
value. The struct will be passed along with a blank password to theverify_password/2
method in the user schema module. - To prevent timing attacks, when
Pow.Ecto.Schema.Changeset.verify_password/3
receives a struct with a nil:password_hash
value, it'll hash a blank password, but always return false. - To prevent timing attacks, the UUID is always generated in
PowResetPassword.Plug.create_reset_token/2
whether the user exists or not. PowPersistentSession.Plug.Base
now accepts:persistent_session_ttl
which will pass the TTL to the cache backend and used for the max age of the sesion cookie inPowPersistentSession.Plug.Cookie
- Deprecated
:persistent_session_cookie_max_age
configuration setting Pow.Store.Backend.MnesiaCache
can now auto join clustersPow.Store.Backend.MnesiaCache.Unsplit
module added for self-healing after network split- Removed
:nodes
config option forPow.Store.Backend.MnesiaCache
- Fixed bug in router filters with Phoenix 1.4.7
- Prevent browser cache of
Pow.Phoenix.SessionController.new/2
,Pow.Phoenix.RegistrationController.new/2
andPowInvitation.Phoenix.InvitationController.edit/2
by setting "Cache-Control" header unless it already has been customized - All links in docs generated with
mix docs
and on hexdocs.pm now works - Generated docs now uses lower case file name except for
README
,CONTRIBUTING
andCHANGELOG
- Removed duplicate call for
Pow.Plug.Session.delete/2
inPow.Plug.Sesssion.create/3
Pow.Phoenix.Router
will now only add specific routes if there is no matching route already defined- Added
Pow.Plug.get_plug/1
and instead of:mod
,:plug
is used in config Pow.Ecto.Context.authenticate/2
now returns nil if user id or password is nil
- Fixed bug with exception raised in
Pow.Ecto.Schema.normalize_user_id_field_value/1
when callingPow.Ecto.Context.get_by/2
with a non binary user id - Fixed bug with exception raised in
Pow.Ecto.Schema.normalize_user_id_field_value/1
when callingPow.Ecto.Context.authenticate/2
with a non binary user id
- Deprecated
Pow.Plug.get_mod/1
- Removed call to
Pow.Ecto.Context.repo/1
- Added support for layout in mails with
Pow.Phoenix.Mailer.Mail
by settingconn.private[:pow_mailer_layout]
same way as the Phoenix layout withconn.private[:phoenix_layout]
- Added
:prefix
repo opts support to use in multitenant apps - Removed
@changeset.data.__struct__.pow_user_id_field()
in template in favor of usingPow.Ecto.Schema.user_id_field/1
- Fixed bug in
Pow.Ecto.Schema.Changeset.current_password_changeset/3
where an exception would be thrown if the virtual:current_password
field of the user struct was set and either the:current_password
change was blank or identical
- Deprecated
Mix.Pow.Ecto.Migration.create_migration_files/3
and moved it toMix.Pow.Ecto.Migration.create_migration_file/3
- Deprecated
Pow.Ecto.Context.repo/1
and moved it toPow.Config.repo!/1
- Deprecated
Pow.Ecto.Context.user_schema_mod/1
and moved it toPow.Config.user!/1
- Fixed bug with Phoenix 1.4.4 scoped routes
- Fixed bug where custom layout setting raised exception in
Pow.Phoenix.ViewHelpers.layout/1
- Prevent users from changing their email to one already taken when the PowEmailConfirmation extension has been enabled
- Added
extension_messages/1
to extension controllers and callbacks - Improved feedback for when no templates are generated for an extension with
mix pow.extension.phoenix.gen.templates
andmix pow.extension.phoenix.mailer.gen.templates
tasks - Error flash is no longer overridden in
Pow.Phoenix.PlugErrorHandler
if the error message is nil - Fixed bug in the migration generator where
references/2
wasn't called with options - Support any
:plug
version below2.0.0
- Deprecated
Pow.Extension.Ecto.Context.Base
- Added
PowInvitation
to themix pow.extension.phoenix.gen.templates
andmix pow.extension.phoenix.mailer.gen.templates
tasks - Fixed issue in umbrella projects where extensions wasn't found in environment configuration
- Fixed so
:namespace
environment config can be used as web app module name - Shell instructions will only be printed if the configuration is missing
- Now requires that
:ecto
or:phoenix
are included in the dependency list for the app to run respective mix tasks - Deprecated
Mix.Pow.context_app/0
- Deprecated
Mix.Pow.ensure_dep!/3
- Deprecated
Mix.Pow.context_base/1
- Added
PowInvitation
extension - Added support in
Pow.Ecto.Schema
for Ecto associations fields - Added support for adding custom methods with
Pow.Extension.Ecto.Schema
through__using__/1
macro in extension ecto schema module - Help information raised with invalid schema arguments for
pow.install
,pow.ecto.install
,pow.ecto.gen.migration
, andpow.ecto.gen.schema
mix tasks PowEmailConfirmation
now redirects unconfirmed users toafter_registration_path/1
orafter_sign_in_path/1
rather thanpow_session_path(conn, :new)
- Correct shell instructions for
mix pow.install
task with custom schema - Fixed bug in
Pow.Extension.Phoenix.Router.Base
andPow.Extension.Phoenix.Messages
where the full extension name wasn't used to namespace methods
- Deprecated
Pow.Extension.Config.underscore_extension/1
- Deprecated
PowResetPassword.Ecto.Context.password_changeset/2
- Deprecated
Pow.Ecto.Schema.filter_new_fields/2
- Deprecated
:messages_backend_fallback
setting for extension controllers - Removed deprecated macro
router_helpers/1
inPow.Phoenix.Controller
- Added flash error message about e-mail confirmation for when user changes e-mail with PowEmailConfirmation enabled
- Added
new_password_changeset/3
andconfirm_password_changeset/3
toPow.Ecto.Schema.Changeset
- Redis cache store backend guide
- Correct shell instructions for
mix pow.phoenix.gen.templates
task - Only load environment config in
Pow.Config.get/3
when no key is set in the provided config - Fixed issue in
Pow.Store.Backend.MnesiaCache.keys/1
andPow.Store.Backend.EtsCache.keys/1
so they now return keys without namespace Pow.Store.Backend.MnesiaCache.put/3
now raises an error if TTL is not provided
PowResetPassword.Plug.reset_password_token/1
has been removed
pow.extension.ecto.gen.migrations
mix task will output warning when a migration file won't be generated for any particular extension- Leading and trailing whitespace is removed from the user id field value (in addition to forced lower case)
- An exception is raised when
pow_routes/0
orpow_extension_routes/0
are used inside router scopes with aliases - Mail view templates assigns now has
[user: user, conn: conn]
along with the template specific assigns - Mail view subject methods now gets the same assigns passed as mail view template assigns instead of only
[conn: conn]
- Added
pow_registration_routes/0
,pow_session_routes/0
andpow_scope/1
macros to the router module - Added guide on how to disable registration
- Phoenix 1.4 support
- Ecto 3.0 support