profiles.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. from django import forms
  2. from django.contrib.auth import get_user_model
  3. from django.core.exceptions import PermissionDenied
  4. from django.utils.translation import gettext_lazy as _
  5. from misago.acl import algebra
  6. from misago.acl.decorators import return_boolean
  7. from misago.acl.models import Role
  8. from misago.admin.forms import YesNoSwitch
  9. from .decorators import authenticated_only
  10. __all__ = [
  11. "allow_browse_users_list",
  12. "can_browse_users_list",
  13. "allow_follow_user",
  14. "can_follow_user",
  15. "allow_block_user",
  16. "can_block_user",
  17. "allow_see_ban_details",
  18. "can_see_ban_details",
  19. ]
  20. CAN_BROWSE_USERS_LIST = YesNoSwitch(label=_("Can browse users list"), initial=1)
  21. CAN_SEARCH_USERS = YesNoSwitch(label=_("Can search user profiles"), initial=1)
  22. CAN_SEE_USER_NAME_HISTORY = YesNoSwitch(label=_("Can see other members name history"))
  23. CAN_SEE_DETAILS = YesNoSwitch(
  24. label=_("Can see members bans details"),
  25. help_text=_(
  26. "Allows users with this permission to see user and staff ban messages."
  27. ),
  28. )
  29. class LimitedPermissionsForm(forms.Form):
  30. legend = _("User profiles")
  31. can_browse_users_list = CAN_BROWSE_USERS_LIST
  32. can_search_users = CAN_SEARCH_USERS
  33. can_see_users_name_history = CAN_SEE_USER_NAME_HISTORY
  34. can_see_ban_details = CAN_SEE_DETAILS
  35. class PermissionsForm(LimitedPermissionsForm):
  36. can_browse_users_list = CAN_BROWSE_USERS_LIST
  37. can_search_users = CAN_SEARCH_USERS
  38. can_follow_users = YesNoSwitch(label=_("Can follow other users"), initial=1)
  39. can_be_blocked = YesNoSwitch(label=_("Can be blocked by other users"), initial=0)
  40. can_see_users_name_history = CAN_SEE_USER_NAME_HISTORY
  41. can_see_ban_details = CAN_SEE_DETAILS
  42. can_see_users_emails = YesNoSwitch(label=_("Can see members e-mails"))
  43. can_see_users_ips = YesNoSwitch(label=_("Can see members IPs"))
  44. can_see_hidden_users = YesNoSwitch(
  45. label=_("Can see members that hide their presence")
  46. )
  47. def change_permissions_form(role):
  48. if isinstance(role, Role):
  49. if role.special_role == "anonymous":
  50. return LimitedPermissionsForm
  51. else:
  52. return PermissionsForm
  53. else:
  54. return None
  55. def build_acl(acl, roles, key_name):
  56. new_acl = {
  57. "can_browse_users_list": 0,
  58. "can_search_users": 0,
  59. "can_follow_users": 0,
  60. "can_be_blocked": 1,
  61. "can_see_users_name_history": 0,
  62. "can_see_ban_details": 0,
  63. "can_see_users_emails": 0,
  64. "can_see_users_ips": 0,
  65. "can_see_hidden_users": 0,
  66. }
  67. new_acl.update(acl)
  68. return algebra.sum_acls(
  69. new_acl,
  70. roles=roles,
  71. key=key_name,
  72. can_browse_users_list=algebra.greater,
  73. can_search_users=algebra.greater,
  74. can_follow_users=algebra.greater,
  75. can_be_blocked=algebra.lower,
  76. can_see_users_name_history=algebra.greater,
  77. can_see_ban_details=algebra.greater,
  78. can_see_users_emails=algebra.greater,
  79. can_see_users_ips=algebra.greater,
  80. can_see_hidden_users=algebra.greater,
  81. )
  82. def add_acl_to_user(user_acl, target):
  83. target.acl["can_have_attitude"] = False
  84. target.acl["can_follow"] = can_follow_user(user_acl, target)
  85. target.acl["can_block"] = can_block_user(user_acl, target)
  86. mod_permissions = ("can_have_attitude", "can_follow", "can_block")
  87. for permission in mod_permissions:
  88. if target.acl[permission]:
  89. target.acl["can_have_attitude"] = True
  90. break
  91. def register_with(registry):
  92. registry.acl_annotator(get_user_model(), add_acl_to_user)
  93. def allow_browse_users_list(user_acl):
  94. if not user_acl["can_browse_users_list"]:
  95. raise PermissionDenied(_("You can't browse users list."))
  96. can_browse_users_list = return_boolean(allow_browse_users_list)
  97. @authenticated_only
  98. def allow_follow_user(user_acl, target):
  99. if not user_acl["can_follow_users"]:
  100. raise PermissionDenied(_("You can't follow other users."))
  101. if user_acl["user_id"] == target.id:
  102. raise PermissionDenied(_("You can't add yourself to followed."))
  103. can_follow_user = return_boolean(allow_follow_user)
  104. @authenticated_only
  105. def allow_block_user(user_acl, target):
  106. if target.is_staff or target.is_superuser:
  107. raise PermissionDenied(_("You can't block administrators."))
  108. if user_acl["user_id"] == target.id:
  109. raise PermissionDenied(_("You can't block yourself."))
  110. # FIXME: check if user has "can be blocked" permission
  111. can_block_user = return_boolean(allow_block_user)
  112. @authenticated_only
  113. def allow_see_ban_details(user_acl, target):
  114. if not user_acl["can_see_ban_details"]:
  115. raise PermissionDenied(_("You can't see users bans details."))
  116. can_see_ban_details = return_boolean(allow_see_ban_details)