schemas.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. from typing import Union
  2. from flask import current_app
  3. from flask_appbuilder.const import (
  4. API_SECURITY_PROVIDER_DB,
  5. API_SECURITY_PROVIDER_LDAP,
  6. AUTH_DB,
  7. AUTH_LDAP,
  8. )
  9. from marshmallow import fields, Schema, ValidationError
  10. from marshmallow.validate import Length, OneOf
  11. provider_to_auth_type = {"db": AUTH_DB, "ldap": AUTH_LDAP}
  12. def validate_password(value: Union[bytes, bytearray, str]) -> None:
  13. if value and sum(value.encode()) == 0:
  14. raise ValidationError("Password null is not allowed")
  15. def validate_provider(value: Union[bytes, bytearray, str]) -> None:
  16. if not current_app.appbuilder.sm.api_login_allow_multiple_providers:
  17. provider_name = current_app.appbuilder.sm.auth_type_provider_name
  18. if provider_name and provider_name != value:
  19. raise ValidationError("Alternative authentication provider is not allowed")
  20. class LoginPost(Schema):
  21. username = fields.String(required=True, allow_none=False, validate=Length(min=1))
  22. password = fields.String(
  23. validate=[Length(min=1), validate_password], required=True, allow_none=False
  24. )
  25. provider = fields.String(
  26. validate=[
  27. OneOf([API_SECURITY_PROVIDER_DB, API_SECURITY_PROVIDER_LDAP]),
  28. validate_provider,
  29. ]
  30. )
  31. refresh = fields.Boolean(required=False)
  32. login_post = LoginPost()