Skip to content

Commit

Permalink
Merge pull request #247 from taigaio/refactor/auth-modules
Browse files Browse the repository at this point in the history
Refactor/auth modules
  • Loading branch information
bameda committed Feb 11, 2015
2 parents dd5cff3 + c517a85 commit 985838c
Show file tree
Hide file tree
Showing 11 changed files with 163 additions and 304 deletions.
1 change: 1 addition & 0 deletions requirements-devel.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ pytest-pythonpath==0.3
coverage==3.7.1
coveralls==0.4.2
django-slowdown==0.0.1
taiga-contrib-github-auth==0.0.2
5 changes: 4 additions & 1 deletion settings/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,10 @@
MEDIA_ROOT = "/tmp"

EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend"
INSTALLED_APPS = INSTALLED_APPS + ["tests"]
INSTALLED_APPS = INSTALLED_APPS + [
"tests",
"taiga_contrib_github_auth",
]

REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"] = {
"anon": None,
Expand Down
36 changes: 7 additions & 29 deletions taiga/auth/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
from taiga.base.api import viewsets
from taiga.base.decorators import list_route
from taiga.base import exceptions as exc
from taiga.base.connectors import github
from taiga.users.services import get_and_validate_user

from .serializers import PublicRegisterSerializer
Expand All @@ -37,8 +36,8 @@
from .services import private_register_for_existing_user
from .services import private_register_for_new_user
from .services import public_register
from .services import github_register
from .services import make_auth_response_data
from .services import get_auth_plugins

from .permissions import AuthPermission

Expand Down Expand Up @@ -135,36 +134,15 @@ def register(self, request, **kwargs):
return self._private_register(request)
raise exc.BadRequest(_("invalid register type"))

def _login(self, request):
username = request.DATA.get('username', None)
password = request.DATA.get('password', None)

user = get_and_validate_user(username=username, password=password)
data = make_auth_response_data(user)
return Response(data, status=status.HTTP_200_OK)

def _github_login(self, request):
code = request.DATA.get('code', None)
token = request.DATA.get('token', None)

email, user_info = github.me(code)

user = github_register(username=user_info.username,
email=email,
full_name=user_info.full_name,
github_id=user_info.id,
bio=user_info.bio,
token=token)
data = make_auth_response_data(user)
return Response(data, status=status.HTTP_200_OK)

# Login view: /api/v1/auth
def create(self, request, **kwargs):
self.check_permissions(request, 'create', None)
auth_plugins = get_auth_plugins()

login_type = request.DATA.get("type", None)

if login_type in auth_plugins:
return auth_plugins[login_type]['login_func'](request)

type = request.DATA.get("type", None)
if type == "normal":
return self._login(request)
elif type == "github":
return self._github_login(request)
raise exc.BadRequest(_("invalid login type"))
69 changes: 28 additions & 41 deletions taiga/auth/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@
from django.db import IntegrityError
from django.utils.translation import ugettext as _

from rest_framework.response import Response
from rest_framework import status

from djmail.template_mail import MagicMailBuilder, InlineCSSTemplateMail

from taiga.base import exceptions as exc
Expand All @@ -39,6 +42,19 @@
from .tokens import get_token_for_user
from .signals import user_registered as user_registered_signal

auth_plugins = {}


def register_auth_plugin(name, login_func):
auth_plugins[name] = {
"login_func": login_func,
}


def get_auth_plugins():
return auth_plugins


def send_register_email(user) -> bool:
"""
Given a user, send register welcome email
Expand Down Expand Up @@ -169,47 +185,6 @@ def private_register_for_new_user(token:str, username:str, email:str,
return user


@tx.atomic
def github_register(username:str, email:str, full_name:str, github_id:int, bio:str, token:str=None):
"""
Register a new user from github.
This can raise `exc.IntegrityError` exceptions in
case of conflics found.
:returns: User
"""
user_model = apps.get_model("users", "User")

try:
# Github user association exist?
user = user_model.objects.get(github_id=github_id)
except user_model.DoesNotExist:
try:
# Is a user with the same email as the github user?
user = user_model.objects.get(email=email)
user.github_id = github_id
user.save(update_fields=["github_id"])
except user_model.DoesNotExist:
# Create a new user
username_unique = slugify_uniquely(username, user_model, slugfield="username")
user = user_model.objects.create(email=email,
username=username_unique,
github_id=github_id,
full_name=full_name,
bio=bio)

send_register_email(user)
user_registered_signal.send(sender=user.__class__, user=user)

if token:
membership = get_membership_by_token(token)
membership.user = user
membership.save(update_fields=["user"])

return user


def make_auth_response_data(user) -> dict:
"""
Given a domain and user, creates data structure
Expand All @@ -220,3 +195,15 @@ def make_auth_response_data(user) -> dict:
data = dict(serializer.data)
data["auth_token"] = get_token_for_user(user, "authentication")
return data


def normal_login_func(request):
username = request.DATA.get('username', None)
password = request.DATA.get('password', None)

user = get_and_validate_user(username=username, password=password)
data = make_auth_response_data(user)
return Response(data, status=status.HTTP_200_OK)


register_auth_plugin("normal", normal_login_func);
4 changes: 0 additions & 4 deletions taiga/base/connectors/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,3 @@
class ConnectorBaseException(BaseException):
status_code = 400
default_detail = _("Connection error.")


class GitHubApiError(ConnectorBaseException):
pass
166 changes: 0 additions & 166 deletions taiga/base/connectors/github.py

This file was deleted.

46 changes: 46 additions & 0 deletions taiga/users/migrations/0007_auto_20150209_1611.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
from django.conf import settings
import django_pgjson.fields


def migrate_github_id(apps, schema_editor):
AuthData = apps.get_model("users", "AuthData")
User = apps.get_model("users", "User")
for user in User.objects.all():
if user.github_id:
AuthData.objects.create(user=user, key="github", value=user.github_id, extra={})


class Migration(migrations.Migration):

dependencies = [
('users', '0006_auto_20141030_1132'),
]

operations = [
migrations.CreateModel(
name='AuthData',
fields=[
('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)),
('key', models.SlugField()),
('value', models.CharField(max_length=300)),
('extra', django_pgjson.fields.JsonField()),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
],
options={
},
bases=(models.Model,),
),
migrations.AlterUniqueTogether(
name='authdata',
unique_together=set([('key', 'value')]),
),
migrations.RunPython(migrate_github_id),
migrations.RemoveField(
model_name='user',
name='github_id',
),
]

0 comments on commit 985838c

Please sign in to comment.