IdHub/oidc4vp/forms.py

80 lines
2.6 KiB
Python
Raw Normal View History

2023-12-04 09:56:22 +00:00
import json
2023-12-04 08:51:08 +00:00
import requests
2023-12-04 09:56:22 +00:00
2023-11-24 15:36:05 +00:00
from django import forms
2023-11-29 16:29:31 +00:00
from django.conf import settings
2023-12-04 08:51:08 +00:00
from django.template.loader import get_template
2023-12-04 09:56:22 +00:00
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError
2023-11-24 15:36:05 +00:00
2023-12-04 09:56:22 +00:00
from utils.idhub_ssikit import create_verifiable_presentation
2023-11-29 16:29:31 +00:00
from oidc4vp.models import Organization
2023-12-07 17:10:04 +00:00
from idhub.models import VerificableCredential
2023-11-24 15:36:05 +00:00
2023-11-29 16:29:31 +00:00
class AuthorizeForm(forms.Form):
def __init__(self, *args, **kwargs):
2023-12-01 16:10:21 +00:00
self.data = kwargs.get('data', {}).copy()
2023-11-29 16:29:31 +00:00
self.user = kwargs.pop('user', None)
2023-12-04 08:51:08 +00:00
self.org = kwargs.pop('org', None)
2023-12-07 17:10:04 +00:00
self.code = kwargs.pop('code', None)
2023-11-29 16:29:31 +00:00
self.presentation_definition = kwargs.pop('presentation_definition', [])
2023-12-01 16:10:21 +00:00
reg = r'({})'.format('|'.join(self.presentation_definition))
2023-11-29 16:29:31 +00:00
self.credentials = self.user.vcredentials.filter(
2023-12-07 17:10:04 +00:00
schema__type__iregex=reg,
status=VerificableCredential.Status.ISSUED.value
2023-11-29 16:29:31 +00:00
)
super().__init__(*args, **kwargs)
2023-12-01 16:10:21 +00:00
for vp in self.presentation_definition:
vp = vp.lower()
choices = [
(str(x.id), x.schema.type.lower()) for x in self.credentials.filter(
schema__type__iexact=vp)
]
self.fields[vp.lower()] = forms.ChoiceField(
widget=forms.RadioSelect,
choices=choices
)
2023-12-01 18:31:09 +00:00
def clean(self):
data = super().clean()
self.list_credentials = []
for c in self.credentials:
if str(c.id) == data.get(c.schema.type.lower()):
2023-12-04 09:56:22 +00:00
if c.status is not c.Status.ISSUED.value or not c.data:
txt = _('There are some problems with this credentials')
raise ValidationError(txt)
2023-12-01 18:31:09 +00:00
self.list_credentials.append(c)
2023-12-04 09:56:22 +00:00
2023-12-07 17:10:04 +00:00
if not self.code:
txt = _("There isn't code in request")
raise ValidationError(txt)
2023-12-01 18:31:09 +00:00
return data
2023-11-29 16:29:31 +00:00
def save(self, commit=True):
2023-12-01 18:31:09 +00:00
if not self.list_credentials:
return
2023-12-04 09:56:22 +00:00
self.get_verificable_presentation()
2023-12-01 16:10:21 +00:00
2023-12-01 18:31:09 +00:00
if commit:
2023-12-07 17:10:04 +00:00
return self.org.send(self.vp, self.code)
2023-12-01 16:10:21 +00:00
2023-12-01 18:31:09 +00:00
return
2023-11-24 15:36:05 +00:00
2023-12-04 09:56:22 +00:00
def get_verificable_presentation(self):
did = self.list_credentials[0].subject_did
vp_template = get_template('credentials/verifiable_presentation.json')
vc_list = json.dumps([json.loads(x.data) for x in self.list_credentials])
context = {
"holder_did": did.did,
"verifiable_credential_list": vc_list
}
unsigned_vp = vp_template.render(context)
self.vp = create_verifiable_presentation(did.key_material, unsigned_vp)