plugins.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.auth.plugins
  4. ~~~~~~~~~~~~~~~~~~~~
  5. Plugin implementations for FlaskBB auth hooks
  6. :copyright: (c) 2014-2018 the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details
  8. """
  9. from flask import flash, redirect, url_for
  10. from flask_login import current_user, logout_user
  11. from ..extensions import db
  12. from . import impl
  13. from ..core.auth.authentication import ForceLogout
  14. from ..user.models import User
  15. from ..utils.settings import flaskbb_config
  16. from .services.authentication import (
  17. BlockUnactivatedUser,
  18. ClearFailedLogins,
  19. DefaultFlaskBBAuthProvider,
  20. MarkFailedLogin,
  21. )
  22. from .services.factories import account_activator_factory
  23. from .services.reauthentication import (
  24. ClearFailedLoginsOnReauth,
  25. DefaultFlaskBBReauthProvider,
  26. MarkFailedReauth,
  27. )
  28. from .services.registration import (
  29. AutoActivateUserPostProcessor,
  30. AutologinPostProcessor,
  31. EmailUniquenessValidator,
  32. SendActivationPostProcessor,
  33. UsernameRequirements,
  34. UsernameUniquenessValidator,
  35. UsernameValidator,
  36. )
  37. @impl(trylast=True)
  38. def flaskbb_authenticate(identifier, secret):
  39. return DefaultFlaskBBAuthProvider().authenticate(identifier, secret)
  40. @impl(tryfirst=True)
  41. def flaskbb_post_authenticate(user):
  42. ClearFailedLogins().handle_post_auth(user)
  43. if flaskbb_config["ACTIVATE_ACCOUNT"]:
  44. BlockUnactivatedUser().handle_post_auth(user)
  45. @impl
  46. def flaskbb_authentication_failed(identifier):
  47. MarkFailedLogin().handle_authentication_failure(identifier)
  48. @impl(trylast=True)
  49. def flaskbb_reauth_attempt(user, secret):
  50. return DefaultFlaskBBReauthProvider().reauthenticate(user, secret)
  51. @impl
  52. def flaskbb_reauth_failed(user):
  53. MarkFailedReauth().handle_reauth_failure(user)
  54. @impl
  55. def flaskbb_post_reauth(user):
  56. ClearFailedLoginsOnReauth().handle_post_reauth(user)
  57. @impl
  58. def flaskbb_errorhandlers(app):
  59. @app.errorhandler(ForceLogout)
  60. def handle_force_logout(error):
  61. if current_user:
  62. logout_user()
  63. if error.reason:
  64. flash(error.reason, "danger")
  65. return redirect(url_for("forum.index"))
  66. @impl
  67. def flaskbb_gather_registration_validators():
  68. blacklist = [
  69. w.strip() for w in flaskbb_config["AUTH_USERNAME_BLACKLIST"].split(",")
  70. ]
  71. requirements = UsernameRequirements(
  72. min=flaskbb_config["AUTH_USERNAME_MIN_LENGTH"],
  73. max=flaskbb_config["AUTH_USERNAME_MAX_LENGTH"],
  74. blacklist=blacklist,
  75. )
  76. return [
  77. EmailUniquenessValidator(User),
  78. UsernameUniquenessValidator(User),
  79. UsernameValidator(requirements),
  80. ]
  81. @impl
  82. def flaskbb_registration_post_processor(user):
  83. if flaskbb_config["ACTIVATE_ACCOUNT"]:
  84. service = SendActivationPostProcessor(account_activator_factory())
  85. else:
  86. service = AutologinPostProcessor()
  87. service.post_process(user)
  88. AutoActivateUserPostProcessor(db, flaskbb_config).post_process(user)