profiles.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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 ugettext_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.core.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. """
  21. Admin Permissions Form
  22. """
  23. CAN_BROWSE_USERS_LIST = YesNoSwitch(
  24. label=_("Can browse users list"),
  25. initial=1
  26. )
  27. CAN_SEARCH_USERS = YesNoSwitch(
  28. label=_("Can search user profiles"),
  29. initial=1
  30. )
  31. CAN_SEE_USER_NAME_HISTORY = YesNoSwitch(
  32. label=_("Can see other members name history")
  33. )
  34. CAN_SEE_DETAILS = YesNoSwitch(
  35. label=_("Can see members bans details"),
  36. help_text=_("Allows users with this permission to see user and staff ban messages.")
  37. )
  38. class LimitedPermissionsForm(forms.Form):
  39. legend = _("User profiles")
  40. can_browse_users_list = CAN_BROWSE_USERS_LIST
  41. can_search_users = CAN_SEARCH_USERS
  42. can_see_users_name_history = CAN_SEE_USER_NAME_HISTORY
  43. can_see_ban_details = CAN_SEE_DETAILS
  44. class PermissionsForm(LimitedPermissionsForm):
  45. can_browse_users_list = CAN_BROWSE_USERS_LIST
  46. can_search_users = CAN_SEARCH_USERS
  47. can_follow_users = YesNoSwitch(
  48. label=_("Can follow other users"),
  49. initial=1
  50. )
  51. can_be_blocked = YesNoSwitch(
  52. label=_("Can be blocked by other users"),
  53. initial=0
  54. )
  55. can_see_users_name_history = CAN_SEE_USER_NAME_HISTORY
  56. can_see_ban_details = CAN_SEE_DETAILS
  57. can_see_users_emails = YesNoSwitch(
  58. label=_("Can see members e-mails")
  59. )
  60. can_see_users_ips = YesNoSwitch(
  61. label=_("Can see members IPs")
  62. )
  63. can_see_hidden_users = YesNoSwitch(
  64. label=_("Can see members that hide their presence")
  65. )
  66. def change_permissions_form(role):
  67. if isinstance(role, Role):
  68. if role.special_role == 'anonymous':
  69. return LimitedPermissionsForm
  70. else:
  71. return PermissionsForm
  72. else:
  73. return None
  74. """
  75. ACL Builder
  76. """
  77. def build_acl(acl, roles, key_name):
  78. new_acl = {
  79. 'can_browse_users_list': 0,
  80. 'can_search_users': 0,
  81. 'can_follow_users': 0,
  82. 'can_be_blocked': 1,
  83. 'can_see_users_name_history': 0,
  84. 'can_see_ban_details': 0,
  85. 'can_see_users_emails': 0,
  86. 'can_see_users_ips': 0,
  87. 'can_see_hidden_users': 0,
  88. }
  89. new_acl.update(acl)
  90. return algebra.sum_acls(new_acl, roles=roles, key=key_name,
  91. can_browse_users_list=algebra.greater,
  92. can_search_users=algebra.greater,
  93. can_follow_users=algebra.greater,
  94. can_be_blocked=algebra.lower,
  95. can_see_users_name_history=algebra.greater,
  96. can_see_ban_details=algebra.greater,
  97. can_see_users_emails=algebra.greater,
  98. can_see_users_ips=algebra.greater,
  99. can_see_hidden_users=algebra.greater
  100. )
  101. """
  102. ACL's for targets
  103. """
  104. def add_acl_to_user(user, target):
  105. target.acl['can_have_attitude'] = False
  106. target.acl['can_follow'] = can_follow_user(user, target)
  107. target.acl['can_block'] = can_block_user(user, target)
  108. mod_permissions = (
  109. 'can_have_attitude',
  110. 'can_follow',
  111. 'can_block',
  112. )
  113. for permission in mod_permissions:
  114. if target.acl[permission]:
  115. target.acl['can_have_attitude'] = True
  116. break
  117. def register_with(registry):
  118. registry.acl_annotator(get_user_model(), add_acl_to_user)
  119. """
  120. ACL tests
  121. """
  122. def allow_browse_users_list(user):
  123. if not user.acl_cache['can_browse_users_list']:
  124. raise PermissionDenied(_("You can't browse users list."))
  125. can_browse_users_list = return_boolean(allow_browse_users_list)
  126. @authenticated_only
  127. def allow_follow_user(user, target):
  128. if not user.acl_cache['can_follow_users']:
  129. raise PermissionDenied(_("You can't follow other users."))
  130. if user.pk == target.pk:
  131. raise PermissionDenied(_("You can't add yourself to followed."))
  132. can_follow_user = return_boolean(allow_follow_user)
  133. @authenticated_only
  134. def allow_block_user(user, target):
  135. if target.is_staff or target.is_superuser:
  136. raise PermissionDenied(_("You can't block administrators."))
  137. if user.pk == target.pk:
  138. raise PermissionDenied(_("You can't block yourself."))
  139. if not target.acl_cache['can_be_blocked'] or target.is_superuser:
  140. message = _("%(user)s can't be blocked.") % {'user': target.username}
  141. raise PermissionDenied(message)
  142. can_block_user = return_boolean(allow_block_user)
  143. @authenticated_only
  144. def allow_see_ban_details(user, target):
  145. if not user.acl_cache['can_see_ban_details']:
  146. raise PermissionDenied(_("You can't see users bans details."))
  147. can_see_ban_details = return_boolean(allow_see_ban_details)