Skip to content

Commit

Permalink
Merge b49b233 into 0c31123
Browse files Browse the repository at this point in the history
  • Loading branch information
helllllllder committed May 20, 2022
2 parents 0c31123 + b49b233 commit 09b9bf5
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 43 deletions.
Empty file.
9 changes: 9 additions & 0 deletions bothub/api/v2/internal/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from rest_framework import permissions


class ModuleHasPermission(permissions.BasePermission):
def has_permission(self, request, view): # pragma: no cover
return request.user.has_perm("authentication.can_communicate_internally")

def has_object_permission(self, request, view, obj):
return self.has_permission(request, view)
47 changes: 5 additions & 42 deletions bothub/api/v2/tests/test_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,48 +42,11 @@
from bothub.common.models import RepositoryVote
from bothub.common.models import RequestRepositoryAuthorization


def get_valid_mockups(categories):
return [
{
"name": "Repository 1",
"slug": "repository-1",
"description": "",
"language": languages.LANGUAGE_EN,
"categories": [category.pk for category in categories],
},
{
"name": "Repository 2",
"description": "",
"language": languages.LANGUAGE_PT,
"categories": [category.pk for category in categories],
},
]


def get_invalid_mockups(categories):
return [
{
"name": "",
"slug": "repository-1",
"language": languages.LANGUAGE_EN,
"categories": [category.pk for category in categories],
},
{
"name": "Repository 3",
"language": "out",
"categories": [category.pk for category in categories],
"is_private": False,
},
]


def create_repository_from_mockup(owner, categories, **mockup):
r = Repository.objects.create(owner_id=owner.id, **mockup)
r.current_version()
for category in categories:
r.categories.add(category)
return r
from bothub.api.v2.tests.utils import (
get_valid_mockups,
get_invalid_mockups,
create_repository_from_mockup,
)


class CreateRepositoryAPITestCase(TestCase):
Expand Down
51 changes: 50 additions & 1 deletion bothub/api/v2/tests/utils.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,58 @@
from bothub.utils import check_module_permission
from rest_framework.authtoken.models import Token

from bothub.authentication.models import User
from bothub.common import languages
from bothub.common.models import Repository


def create_user_and_token(nickname="fake"):
def create_user_and_token(nickname="fake", module=False):
user = User.objects.create_user("{}@user.com".format(nickname), nickname)
if module is True:
check_module_permission({"can_communicate_internally": module}, user)
user = User.objects.get(email=user.email)
token, create = Token.objects.get_or_create(user=user)
return (user, token)


def get_valid_mockups(categories):
return [
{
"name": "Repository 1",
"slug": "repository-1",
"description": "",
"language": languages.LANGUAGE_EN,
"categories": [category.pk for category in categories],
},
{
"name": "Repository 2",
"description": "",
"language": languages.LANGUAGE_PT,
"categories": [category.pk for category in categories],
},
]


def get_invalid_mockups(categories):
return [
{
"name": "",
"slug": "repository-1",
"language": languages.LANGUAGE_EN,
"categories": [category.pk for category in categories],
},
{
"name": "Repository 3",
"language": "out",
"categories": [category.pk for category in categories],
"is_private": False,
},
]


def create_repository_from_mockup(owner, categories, **mockup):
r = Repository.objects.create(owner_id=owner.id, **mockup)
r.current_version()
for category in categories:
r.categories.add(category)
return r
6 changes: 6 additions & 0 deletions bothub/authentication/authorization.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import logging

from django.utils.translation import ugettext_lazy as _
from bothub.utils import check_module_permission


from mozilla_django_oidc.auth import OIDCAuthenticationBackend
from rest_framework import exceptions
from rest_framework.authentication import TokenAuthentication, get_authorization_header
Expand Down Expand Up @@ -97,11 +100,14 @@ def create_user(self, claims):
user.name = claims.get("name", "")
user.save()

check_module_permission(claims, user)

return user

def update_user(self, user, claims):
user.name = claims.get("name", "")
user.email = claims.get("email", "")
user.save()
check_module_permission(claims, user)

return user
30 changes: 30 additions & 0 deletions bothub/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from rest_framework import status
from rest_framework.exceptions import APIException, ValidationError


entity_regex = re.compile(
r"\[(?P<entity_text>[^\]]+)" r"\]\((?P<entity>[^:)]*?)" r"(?:\:(?P<value>[^)]+))?\)"
)
Expand Down Expand Up @@ -375,6 +376,17 @@ def get_organization(request, organization_id: int):
)


def get_user_and_organization(user_email: str, organization_id: int):
from bothub.authentication.models import User
from bothub.common.models import Organization

org = Organization.objects.get(pk=organization_id)
user, created = User.objects.get_or_create(
email=user_email, defaults={"nickname": user_email}
)
return user, org


class TimeBasedDocument(Document):
def save(self, action="create", **kwargs):
return super().save(action=action, **kwargs)
Expand Down Expand Up @@ -462,3 +474,21 @@ def filter_has_invalid_entities(self, queryset, name, value):
return filter_validate_entities(queryset, value).exclude(
original_entities_count=F("entities_count")
)


def check_module_permission(claims, user):
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from bothub.common.models import User

if claims.get("can_communicate_internally", False):
content_type = ContentType.objects.get_for_model(User)
permission, created = Permission.objects.get_or_create(
codename="can_communicate_internally",
name="can communicate internally",
content_type=content_type,
)
if not user.has_perm("authentication.can_communicate_internally"):
user.user_permissions.add(permission)
return True
return False

0 comments on commit 09b9bf5

Please sign in to comment.