def make_auth_response_data(user) -> dict:
    """
    Given a domain and user, creates data structure
    using python dict containing a representation
    of the logged user.
    """
    serializer = UserAdminSerializer(user)
    data = dict(serializer.data)
    data["auth_token"] = get_token_for_user(user, "authentication")
    return data
Exemple #2
0
def make_auth_response_data(user):
    serializer = UserAdminSerializer(user)
    data = dict(serializer.data)

    refresh = RefreshToken.for_user(user)

    data['refresh'] = str(refresh)
    data['auth_token'] = str(refresh.access_token)

    return data
Exemple #3
0
def make_auth_response_data(user) -> dict:
    """
    Given a domain and user, creates data structure
    using python dict containing a representation
    of the logged user.
    """
    serializer = UserAdminSerializer(user)
    data = dict(serializer.data)
    data["auth_token"] = get_token_for_user(user, "authentication")
    data["email"] = user.email
    data["public_key"] = user.public_key
    data["threebot_name"] = user.threebot_name
    return data
Exemple #4
0
def make_auth_response_data(user):
    serializer = UserAdminSerializer(user)
    data = dict(serializer.data)

    refresh = RefreshToken.for_user(user)

    data['refresh'] = str(refresh)
    data['auth_token'] = str(refresh.access_token)

    if api_settings.UPDATE_LAST_LOGIN:
        update_last_login(None, user)

    return data
Exemple #5
0
def test_user_update(client, data):
    url = reverse('users-detail', kwargs={"pk": data.registered_user.pk})

    users = [
        None,
        data.registered_user,
        data.other_user,
        data.superuser,
    ]

    user_data = UserAdminSerializer(data.registered_user).data
    user_data["full_name"] = "test"
    user_data = json.dumps(user_data)

    results = helper_test_http_method(client, 'put', url, user_data, users)
    assert results == [401, 200, 403, 200]
def callback(req):
    t = Token()
    try:
        user, _ = t.authenticate(req)
        if user:
            login(req, user)
    except NotAuthenticated:
        pass

    data = req.GET.get('signedAttempt')
    if not data:
        return JsonResponse(
            {
                "_error_message":
                "one or more parameter values were missing (signedAttempt)",
                "_error_type": ""
            },
            status=400)

    data = json.loads(data)
    username = data['doubleName']
    if not username:
        return JsonResponse(
            {
                "_error_message": "Bad request, some params are missing",
                "_error_type": ""
            },
            status=400)

    res = requests.get(
        settings.THREEBOT_URL + '/api/users/{0}'.format(username),
        {'Content-Type': 'application/json'})

    if res.status_code != 200:
        return JsonResponse(
            {
                "_error_message": "Error getting user pub key",
                "_error_type": ""
            },
            status=400)

    user_pub_key = nacl.signing.VerifyKey(res.json()['publicKey'],
                                          encoder=nacl.encoding.Base64Encoder)
    pk = res.json()["publicKey"]

    # verify data
    signedData = data['signedAttempt']
    if not signedData:
        return JsonResponse(
            {
                "_error_message": "Bad request, some params are missing",
                "_error_type": ""
            },
            status=400)

    verifiedData = user_pub_key.verify(base64.b64decode(signedData)).decode()

    data = json.loads(verifiedData)

    if not data:
        return JsonResponse(
            {
                "_error_message": "Bad request, some params are missing",
                "_error_type": ""
            },
            status=400)

    if data['doubleName'] != username:
        return JsonResponse(
            {
                "_error_message": "Bad request, some params are missing",
                "_error_type": ""
            },
            status=400)

    # verify state
    state = data['signedState']
    if not state or state != req.session.get("state"):
        return JsonResponse(
            {
                "_error_message": "Invalid state",
                "_error_type": ""
            }, status=400)

    nonce = base64.b64decode(data['data']['nonce'])
    ciphertext = base64.b64decode(data['data']['ciphertext'])

    private_key = nacl.signing.SigningKey(settings.PRIVATE_KEY,
                                          encoder=nacl.encoding.Base64Encoder)

    box = Box(private_key.to_curve25519_private_key(),
              user_pub_key.to_curve25519_public_key())
    try:
        decrypted = box.decrypt(ciphertext, nonce)
        result = json.loads(decrypted)
        email = result["email"]["email"]

        sei = result['email']['sei']
        res = requests.post(settings.OPEN_KYC_URL,
                            headers={'Content-Type': 'application/json'},
                            json={'signedEmailIdentifier': sei})
        if res.status_code != 200:
            return JsonResponse(
                {
                    "_error_message": "Email not verified",
                    "_error_type": ""
                },
                status=400)

        user_model = get_user_model()

        users_with_email = user_model.objects.filter(email=email)
        if users_with_email:
            user_with_email = users_with_email[0]
        else:
            user_with_email = None

        # Link user to 3bot login account
        if req.user.is_authenticated():
            user = user_model.objects.filter(id=req.user.id)[0]
            if user_with_email and user_with_email.id != req.user.id:
                return JsonResponse(
                    {
                        "_error_message":
                        "Email address is linked with another active account",
                        "_error_type": ""
                    },
                    status=400)
            # user already linked with 3 bot login
            if user.public_key:
                # user linking another account
                if user.public_key != pk:
                    user.email = email
                    user.public_key = pk
                    user.threebot_name = username.replace('.3bot', '')
                    user.save()
            else:
                # user linking their account for first time
                user.email = email
                user.public_key = pk
                user.threebot_name = username.replace('.3bot', '')
                user.save()
        else:
            users = user_model.objects.filter(
                Q(email=email) | Q(public_key=pk))
            if len(users) == 0:
                # new user
                username = username.replace('.3bot', '')
                user = user_model(username=username,
                                  email=email,
                                  full_name=username,
                                  public_key=pk)
                user.is_active = True
                user.public_key = pk
                user.threebot_name = username
                user.save()
            else:
                # email or public key exists
                user = users[0]
                if user.public_key != pk:
                    user.public_key = pk
                    user.threebot_name = username.replace('.3bot', '')
                    user.save()
                elif user.email != email:
                    user.email = email
                    user.threebot_name = username.replace('.3bot', '')
                    user.save()
        login(req, user)
    except:
        raise
    serializer = UserAdminSerializer(user)
    data = dict(serializer.data)
    data["auth_token"] = get_token_for_user(user, "authentication")
    data['public_key'] = pk
    data['email'] = email
    data['threebot_name'] = username.replace('.3bot', '')
    data['roles'] = [role for role in data['roles']]
    return JsonResponse(data)