acl.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from django.utils.translation import ugettext_lazy as _
  2. from django import forms
  3. from misago.acl.builder import BaseACL
  4. from misago.acl.utils import ACLError403, ACLError404
  5. from misago.forms import YesNoSwitch
  6. def make_forum_form(request, role, form):
  7. form.base_fields['can_see_forum'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
  8. form.base_fields['can_see_forum_contents'] = forms.BooleanField(widget=YesNoSwitch,initial=False,required=False)
  9. form.layout.append((
  10. _("Forums Permissions"),
  11. (
  12. ('can_see_forum', {'label': _("Can see forum")}),
  13. ('can_see_forum_contents', {'label': _("Can see forum contents")}),
  14. ),
  15. ))
  16. class ForumsACL(BaseACL):
  17. def known_forums(self):
  18. return self.acl['can_see']
  19. def can_see(self, forum):
  20. try:
  21. return forum.pk in self.acl['can_see']
  22. except AttributeError:
  23. return long(forum) in self.acl['can_see']
  24. def can_browse(self, forum):
  25. if self.can_see(forum):
  26. try:
  27. return forum.pk in self.acl['can_browse']
  28. except AttributeError:
  29. return long(forum) in self.acl['can_browse']
  30. return False
  31. def allow_forum_view(self, forum):
  32. if not self.can_see(forum):
  33. raise ACLError404()
  34. if not self.can_browse(forum):
  35. raise ACLError403(_("You don't have permission to browse this forum."))
  36. def build_forums(acl, perms, forums, forum_roles):
  37. acl.forums = ForumsACL()
  38. acl.forums.acl['can_see'] = []
  39. acl.forums.acl['can_browse'] = []
  40. for forum in forums:
  41. for perm in perms:
  42. try:
  43. role = forum_roles[perm['forums'][forum.pk]]
  44. if role['can_see_forum'] and forum.pk not in acl.forums.acl['can_see']:
  45. acl.forums.acl['can_see'].append(forum.pk)
  46. if role['can_see_forum_contents'] and forum.pk not in acl.forums.acl['can_browse']:
  47. acl.forums.acl['can_browse'].append(forum.pk)
  48. except KeyError:
  49. pass
  50. def cleanup(acl, perms, forums):
  51. for forum in forums:
  52. if forum.pk in acl.forums.acl['can_browse'] and not forum.pk in acl.forums.acl['can_see']:
  53. # First burp: we can read forum but we cant see forum
  54. del acl.forums.acl['can_browse'][acl.forums.acl['can_browse'].index(forum.pk)]
  55. if forum.level > 1:
  56. if forum.parent_id not in acl.forums.acl['can_see'] or forum.parent_id not in acl.forums.acl['can_browse']:
  57. # Second burp: we cant see or read parent forum
  58. try:
  59. del acl.forums.acl['can_see'][acl.forums.acl['can_see'].index(forum.pk)]
  60. except ValueError:
  61. pass
  62. try:
  63. del acl.forums.acl['can_browse'][acl.forums.acl['can_browse'].index(forum.pk)]
  64. except ValueError:
  65. pass