Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
from datetime import datetime, timedelta
import json
import re
import secrets
import pytz

from django.shortcuts import redirect

from django.conf import settings
from django.http import JsonResponse
from django.contrib.auth import authenticate
from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout
from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.decorators.http import require_http_methods

from ratelimit.decorators import ratelimit
from siwe.siwe import SiweMessage

from .custom_groups.group_manager import GroupManager
from .models import Wallet
from .utils.nonce import Nonce

import logging


@ratelimit(key='ip', rate='5/m')
@require_http_methods(["POST"])
def login(request):
    logging.error('logging stuff')
    body = json.loads(request.body)
    auth_kwargs = {
        "siwe_message": SiweMessage(
            message=_dict_camel_case_to_snake_case(body["message"])
        ),
        "signature": body["signature"]
    }
    wallet = authenticate(request, **auth_kwargs)
    if wallet is not None:
        if wallet.is_active:
            auth_login(request, wallet)
            return JsonResponse({"success": True, "message": "Successful login."})
        else:
            return JsonResponse(
                {"success": False, "message": "Wallet disabled."}, status=401
            )
    return JsonResponse({"success": False, "message": "Invalid login."}, status=403)


def _check_groups(wallet: Wallet):
    for group in settings.CUSTOM_GROUPS:
        name: str = group[0]
        manager: GroupManager = group[1]

        if manager.is_member(ethereum_address=wallet.ethereum_address):
            wallet.groups.add(name)
        else:
            wallet.groups.remove(name)


@ratelimit(key='ip', rate='5/m')
@require_http_methods(["POST"])
def logout(request):
    auth_logout(request)
    return redirect(settings.LOGIN_URL)


@ratelimit(key='ip', rate='5/m')
@require_http_methods(["GET"])
def nonce(request):
    n = Nonce()
    request.session["nonce"] = {"value": n.value, "expiration": n.expiration.isoformat()}
    return JsonResponse({"nonce": n.value})


def _dict_camel_case_to_snake_case(data: dict) -> dict:
    """Converts keys in dictionary from camel case to snake case
    """
    return {
        re.sub(r"(?<!^)(?=[A-Z])", "_", k).lower(): v
        for k, v in data.items()
    }