profiles.py 4.7 KB

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