add type in schemas
This commit is contained in:
parent
89f1668c5c
commit
8da426ef34
|
@ -772,11 +772,14 @@ class SchemasNewView(SchemasMix):
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
data = f.read().decode('utf-8')
|
data = f.read().decode('utf-8')
|
||||||
assert credtools.validate_schema(json.loads(data))
|
ldata = json.loads(data)
|
||||||
|
assert credtools.validate_schema(ldata)
|
||||||
|
name = ldata.get('name')
|
||||||
|
assert name
|
||||||
except Exception:
|
except Exception:
|
||||||
messages.error(self.request, _('This is not a valid schema!'))
|
messages.error(self.request, _('This is not a valid schema!'))
|
||||||
return
|
return
|
||||||
schema = Schemas.objects.create(file_schema=file_name, data=data)
|
schema = Schemas.objects.create(file_schema=file_name, data=data, type=name)
|
||||||
schema.save()
|
schema.save()
|
||||||
return schema
|
return schema
|
||||||
|
|
||||||
|
@ -818,10 +821,14 @@ class SchemasImportAddView(SchemasMix):
|
||||||
data = self.open_file(file_name)
|
data = self.open_file(file_name)
|
||||||
try:
|
try:
|
||||||
json.loads(data)
|
json.loads(data)
|
||||||
|
ldata = json.loads(data)
|
||||||
|
assert credtools.validate_schema(ldata)
|
||||||
|
name = ldata.get('name')
|
||||||
|
assert name
|
||||||
except Exception:
|
except Exception:
|
||||||
messages.error(self.request, _('This is not a valid schema!'))
|
messages.error(self.request, _('This is not a valid schema!'))
|
||||||
return
|
return
|
||||||
schema = Schemas.objects.create(file_schema=file_name, data=data)
|
schema = Schemas.objects.create(file_schema=file_name, data=data, type=name)
|
||||||
schema.save()
|
schema.save()
|
||||||
return schema
|
return schema
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 4.2.5 on 2023-11-15 09:58
|
# Generated by Django 4.2.5 on 2023-11-29 16:14
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
@ -57,27 +57,6 @@ class Migration(migrations.Migration):
|
||||||
('created_at', models.DateTimeField(auto_now=True)),
|
('created_at', models.DateTimeField(auto_now=True)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
|
||||||
name='Organization',
|
|
||||||
fields=[
|
|
||||||
(
|
|
||||||
'id',
|
|
||||||
models.BigAutoField(
|
|
||||||
auto_created=True,
|
|
||||||
primary_key=True,
|
|
||||||
serialize=False,
|
|
||||||
verbose_name='ID',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
('name', models.CharField(max_length=250)),
|
|
||||||
(
|
|
||||||
'url',
|
|
||||||
models.CharField(
|
|
||||||
help_text='Url where to send the presentation', max_length=250
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Rol',
|
name='Rol',
|
||||||
fields=[
|
fields=[
|
||||||
|
@ -111,6 +90,7 @@ class Migration(migrations.Migration):
|
||||||
verbose_name='ID',
|
verbose_name='ID',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
('type', models.CharField(max_length=250)),
|
||||||
('file_schema', models.CharField(max_length=250)),
|
('file_schema', models.CharField(max_length=250)),
|
||||||
('data', models.TextField()),
|
('data', models.TextField()),
|
||||||
('created_at', models.DateTimeField(auto_now=True)),
|
('created_at', models.DateTimeField(auto_now=True)),
|
||||||
|
@ -274,36 +254,39 @@ class Migration(migrations.Migration):
|
||||||
'type',
|
'type',
|
||||||
models.PositiveSmallIntegerField(
|
models.PositiveSmallIntegerField(
|
||||||
choices=[
|
choices=[
|
||||||
(1, 'EV_USR_REGISTERED'),
|
(1, 'User registered'),
|
||||||
(2, 'EV_USR_WELCOME'),
|
(2, 'User welcomed'),
|
||||||
(3, 'EV_DATA_UPDATE_REQUESTED_BY_USER'),
|
(3, 'Data update requested by user'),
|
||||||
(4, 'EV_DATA_UPDATE_REQUESTED'),
|
(
|
||||||
(5, 'EV_USR_UPDATED_BY_ADMIN'),
|
4,
|
||||||
(6, 'EV_USR_UPDATED'),
|
'Data update requested. Pending approval by administrator',
|
||||||
(7, 'EV_USR_DELETED_BY_ADMIN'),
|
),
|
||||||
(8, 'EV_DID_CREATED_BY_USER'),
|
(5, "User's data updated by admin"),
|
||||||
(9, 'EV_DID_CREATED'),
|
(6, 'Your data updated by admin'),
|
||||||
(10, 'EV_DID_DELETED'),
|
(7, 'User deactivated by admin'),
|
||||||
(11, 'EV_CREDENTIAL_DELETED_BY_ADMIN'),
|
(8, 'DID created by user'),
|
||||||
(12, 'EV_CREDENTIAL_DELETED'),
|
(9, 'DID created'),
|
||||||
(13, 'EV_CREDENTIAL_ISSUED_FOR_USER'),
|
(10, 'DID deleted'),
|
||||||
(14, 'EV_CREDENTIAL_ISSUED'),
|
(11, 'Credential deleted by user'),
|
||||||
(15, 'EV_CREDENTIAL_PRESENTED_BY_USER'),
|
(12, 'Credential deleted'),
|
||||||
(16, 'EV_CREDENTIAL_PRESENTED'),
|
(13, 'Credential issued for user'),
|
||||||
(17, 'EV_CREDENTIAL_ENABLED'),
|
(14, 'Credential issued'),
|
||||||
(18, 'EV_CREDENTIAL_CAN_BE_REQUESTED'),
|
(15, 'Credential presented by user'),
|
||||||
(19, 'EV_CREDENTIAL_REVOKED_BY_ADMIN'),
|
(16, 'Credential presented'),
|
||||||
(20, 'EV_CREDENTIAL_REVOKED'),
|
(17, 'Credential enabled'),
|
||||||
(21, 'EV_ROLE_CREATED_BY_ADMIN'),
|
(18, 'Credential available'),
|
||||||
(22, 'EV_ROLE_MODIFIED_BY_ADMIN'),
|
(19, 'Credential revoked by admin'),
|
||||||
(23, 'EV_ROLE_DELETED_BY_ADMIN'),
|
(20, 'Credential revoked'),
|
||||||
(24, 'EV_SERVICE_CREATED_BY_ADMIN'),
|
(21, 'Role created by admin'),
|
||||||
(25, 'EV_SERVICE_MODIFIED_BY_ADMIN'),
|
(22, 'Role modified by admin'),
|
||||||
(26, 'EV_SERVICE_DELETED_BY_ADMIN'),
|
(23, 'Role deleted by admin'),
|
||||||
(27, 'EV_ORG_DID_CREATED_BY_ADMIN'),
|
(24, 'Service created by admin'),
|
||||||
(28, 'EV_ORG_DID_DELETED_BY_ADMIN'),
|
(25, 'Service modified by admin'),
|
||||||
(29, 'EV_USR_DEACTIVATED_BY_ADMIN'),
|
(26, 'Service deleted by admin'),
|
||||||
(30, 'EV_USR_ACTIVATED_BY_ADMIN'),
|
(27, 'Organisational DID created by admin'),
|
||||||
|
(28, 'Organisational DID deleted by admin'),
|
||||||
|
(29, 'User deactivated'),
|
||||||
|
(30, 'User activated'),
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -431,6 +431,7 @@ class DID(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Schemas(models.Model):
|
class Schemas(models.Model):
|
||||||
|
type = models.CharField(max_length=250)
|
||||||
file_schema = models.CharField(max_length=250)
|
file_schema = models.CharField(max_length=250)
|
||||||
data = models.TextField()
|
data = models.TextField()
|
||||||
created_at = models.DateTimeField(auto_now=True)
|
created_at = models.DateTimeField(auto_now=True)
|
||||||
|
@ -492,10 +493,9 @@ class VerificableCredential(models.Model):
|
||||||
return json.loads(self.data)
|
return json.loads(self.data)
|
||||||
|
|
||||||
def type(self):
|
def type(self):
|
||||||
if self.data:
|
# if self.data and:
|
||||||
return self.get_schema.get('type')[-1]
|
# return self.get_schema.get('type')[-1]
|
||||||
|
return self.schema.type
|
||||||
return self.schema.name()
|
|
||||||
|
|
||||||
def description(self):
|
def description(self):
|
||||||
if not self.data:
|
if not self.data:
|
||||||
|
|
103
oidc4vp/forms.py
103
oidc4vp/forms.py
|
@ -1,41 +1,78 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
from oidc4vp.models import Organization
|
||||||
|
|
||||||
|
|
||||||
class Organization(forms.Form):
|
# class OrganizationForm(forms.Form):
|
||||||
wallet = forms.ChoiceField(
|
# wallet = forms.ChoiceField(
|
||||||
"Wallet",
|
# "Wallet",
|
||||||
choices=[(x.id, x.name) for x in Organization.objects.all()]
|
# choices=[(x.id, x.name) for x in Organization.objects.all()]
|
||||||
)
|
# )
|
||||||
|
|
||||||
def clean_wallet(self):
|
# def clean_wallet(self):
|
||||||
data = self.cleaned_data["wallet"]
|
# data = self.cleaned_data["wallet"]
|
||||||
organization = Organization.objects.filter(
|
# organization = Organization.objects.filter(
|
||||||
id=data
|
# id=data
|
||||||
|
# )
|
||||||
|
|
||||||
|
# if not organization.exists():
|
||||||
|
# raise ValidationError("organization is not valid!")
|
||||||
|
|
||||||
|
# self.organization = organization.first()
|
||||||
|
|
||||||
|
# return data
|
||||||
|
|
||||||
|
# def authorize(self):
|
||||||
|
# data = {
|
||||||
|
# "response_type": "vp_token",
|
||||||
|
# "response_mode": "direct_post",
|
||||||
|
# "client_id": self.organization.client_id,
|
||||||
|
# "response_uri": settings.RESPONSE_URI,
|
||||||
|
# "presentation_definition": self.pv_definition(),
|
||||||
|
# "nonce": ""
|
||||||
|
# }
|
||||||
|
# query_dict = QueryDict('', mutable=True)
|
||||||
|
# query_dict.update(data)
|
||||||
|
|
||||||
|
# url = '{response_uri}/authorize?{params}'.format(
|
||||||
|
# response_uri=self.organization.response_uri,
|
||||||
|
# params=query_dict.urlencode()
|
||||||
|
# )
|
||||||
|
|
||||||
|
# def pv_definition(self):
|
||||||
|
# return ""
|
||||||
|
|
||||||
|
|
||||||
|
class AuthorizeForm(forms.Form):
|
||||||
|
organization = forms.ChoiceField(choices=[])
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
# import pdb; pdb.set_trace()
|
||||||
|
self.user = kwargs.pop('user', None)
|
||||||
|
self.presentation_definition = kwargs.pop('presentation_definition', [])
|
||||||
|
self.credentials = self.user.vcredentials.filter(
|
||||||
|
schema__type__in=self.presentation_definition
|
||||||
)
|
)
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.fields['organization'].choices = [
|
||||||
|
(x.id, x.name) for x in Organization.objects.filter()
|
||||||
|
if x.response_uri != settings.RESPONSE_URI
|
||||||
|
]
|
||||||
|
|
||||||
if not organization.exists():
|
def save(self, commit=True):
|
||||||
raise ValidationError("organization is not valid!")
|
self.org = Organization.objects.filter(
|
||||||
|
id=self.data['organization']
|
||||||
self.organization = organization.first()
|
|
||||||
|
|
||||||
return data
|
|
||||||
|
|
||||||
def authorize(self):
|
|
||||||
data = {
|
|
||||||
"response_type": "vp_token",
|
|
||||||
"response_mode": "direct_post",
|
|
||||||
"client_id": self.organization.client_id,
|
|
||||||
"response_uri": settings.RESPONSE_URI,
|
|
||||||
"presentation_definition": self.pv_definition(),
|
|
||||||
"nonce": ""
|
|
||||||
}
|
|
||||||
query_dict = QueryDict('', mutable=True)
|
|
||||||
query_dict.update(data)
|
|
||||||
|
|
||||||
url = '{response_uri}/authorize?{params}'.format(
|
|
||||||
response_uri=self.organization.response_uri,
|
|
||||||
params=query_dict.urlencode()
|
|
||||||
)
|
)
|
||||||
|
if not self.org.exists():
|
||||||
|
return
|
||||||
|
|
||||||
|
self.org = self.org[0]
|
||||||
|
|
||||||
|
if commit:
|
||||||
|
url = self.org.demand_authorization()
|
||||||
|
if url.status_code == 200:
|
||||||
|
return url.json().get('redirect_uri')
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
def pv_definition(self):
|
|
||||||
return ""
|
|
||||||
|
|
|
@ -11,9 +11,8 @@ from django.urls import reverse_lazy
|
||||||
from oidc4vp.models import Authorization, Organization
|
from oidc4vp.models import Authorization, Organization
|
||||||
from idhub.mixins import UserView
|
from idhub.mixins import UserView
|
||||||
|
|
||||||
from idhub.user.forms import (
|
from oidc4vp.forms import AuthorizeForm
|
||||||
DemandAuthorizationForm
|
|
||||||
)
|
|
||||||
|
|
||||||
# from django.core.mail import send_mail
|
# from django.core.mail import send_mail
|
||||||
# from django.http import HttpResponse, HttpResponseRedirect
|
# from django.http import HttpResponse, HttpResponseRedirect
|
||||||
|
@ -29,12 +28,15 @@ class AuthorizeView(UserView, FormView):
|
||||||
template_name = "credentials_presentation.html"
|
template_name = "credentials_presentation.html"
|
||||||
subtitle = _('Credential presentation')
|
subtitle = _('Credential presentation')
|
||||||
icon = 'bi bi-patch-check-fill'
|
icon = 'bi bi-patch-check-fill'
|
||||||
form_class = DemandAuthorizationForm
|
form_class = AuthorizeForm
|
||||||
success_url = reverse_lazy('idhub:user_demand_authorization')
|
success_url = reverse_lazy('idhub:user_demand_authorization')
|
||||||
|
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
kwargs = super().get_form_kwargs()
|
kwargs = super().get_form_kwargs()
|
||||||
kwargs['user'] = self.request.user
|
kwargs['user'] = self.request.user
|
||||||
|
vps = self.request.GET.get('presentation_definition')
|
||||||
|
# import pdb; pdb.set_trace()
|
||||||
|
kwargs['presentation_definition'] = json.loads(vps)
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
|
@ -77,7 +79,7 @@ class VerifyView(View):
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
org = self.validate(request)
|
org = self.validate(request)
|
||||||
import pdb; pdb.set_trace()
|
# import pdb; pdb.set_trace()
|
||||||
# # TODO: incorporate request.POST["presentation_submission"] as schema definition
|
# # TODO: incorporate request.POST["presentation_submission"] as schema definition
|
||||||
# (presentation_valid, _) = verify_presentation(request.POST["vp_token"])
|
# (presentation_valid, _) = verify_presentation(request.POST["vp_token"])
|
||||||
# if not presentation_valid:
|
# if not presentation_valid:
|
||||||
|
|
Loading…
Reference in New Issue