add url public for get a credential with hash
This commit is contained in:
parent
6505d8e6b3
commit
2df5b42610
|
@ -239,7 +239,6 @@ class ImportCertificateForm(forms.Form):
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
data = super().clean()
|
data = super().clean()
|
||||||
# import pdb; pdb.set_trace()
|
|
||||||
file_import = data.get('file_import')
|
file_import = data.get('file_import')
|
||||||
self.pfx_file = file_import.read()
|
self.pfx_file = file_import.read()
|
||||||
self.file_name = file_import.name
|
self.file_name = file_import.name
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 4.2.5 on 2024-01-10 11:52
|
# Generated by Django 4.2.5 on 2024-01-11 10:17
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
@ -151,6 +151,8 @@ class Migration(migrations.Migration):
|
||||||
('issued_on', models.DateTimeField(null=True)),
|
('issued_on', models.DateTimeField(null=True)),
|
||||||
('data', models.TextField()),
|
('data', models.TextField()),
|
||||||
('csv_data', models.TextField()),
|
('csv_data', models.TextField()),
|
||||||
|
('public', models.BooleanField(default=True)),
|
||||||
|
('hash', models.CharField(max_length=260)),
|
||||||
(
|
(
|
||||||
'status',
|
'status',
|
||||||
models.PositiveSmallIntegerField(
|
models.PositiveSmallIntegerField(
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import json
|
import json
|
||||||
import pytz
|
import pytz
|
||||||
|
import hashlib
|
||||||
import datetime
|
import datetime
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -467,6 +468,8 @@ class VerificableCredential(models.Model):
|
||||||
issued_on = models.DateTimeField(null=True)
|
issued_on = models.DateTimeField(null=True)
|
||||||
data = models.TextField()
|
data = models.TextField()
|
||||||
csv_data = models.TextField()
|
csv_data = models.TextField()
|
||||||
|
public = models.BooleanField(default=settings.DEFAULT_PUBLIC_CREDENTIALS)
|
||||||
|
hash = models.CharField(max_length=260)
|
||||||
status = models.PositiveSmallIntegerField(
|
status = models.PositiveSmallIntegerField(
|
||||||
choices=Status.choices,
|
choices=Status.choices,
|
||||||
default=Status.ENABLED
|
default=Status.ENABLED
|
||||||
|
@ -520,6 +523,8 @@ class VerificableCredential(models.Model):
|
||||||
self.render(),
|
self.render(),
|
||||||
self.issuer_did.key_material
|
self.issuer_did.key_material
|
||||||
)
|
)
|
||||||
|
if self.public:
|
||||||
|
self.hash = hashlib.sha3_256(self.data.encode()).hexdigest()
|
||||||
|
|
||||||
def get_context(self):
|
def get_context(self):
|
||||||
d = json.loads(self.csv_data)
|
d = json.loads(self.csv_data)
|
||||||
|
@ -528,8 +533,12 @@ class VerificableCredential(models.Model):
|
||||||
format = "%Y-%m-%dT%H:%M:%SZ"
|
format = "%Y-%m-%dT%H:%M:%SZ"
|
||||||
issuance_date = self.issued_on.strftime(format)
|
issuance_date = self.issued_on.strftime(format)
|
||||||
|
|
||||||
url_id = "{}/credentials/{}".format(
|
cred_path = 'credentials'
|
||||||
|
if self.public:
|
||||||
|
cred_path = 'public/credentials'
|
||||||
|
url_id = "{}/{}/{}".format(
|
||||||
settings.DOMAIN.strip("/"),
|
settings.DOMAIN.strip("/"),
|
||||||
|
cred_path,
|
||||||
self.id
|
self.id
|
||||||
)
|
)
|
||||||
context = {
|
context = {
|
||||||
|
|
|
@ -37,6 +37,11 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mt-3">
|
<div class="row mt-3">
|
||||||
|
{% if object.public %}
|
||||||
|
<div class="col text-center">
|
||||||
|
<a class="btn btn-green-user" href="{% url 'idhub:user_credential_pdf' object.id %}">{% trans 'View in PDF format' %}</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
<div class="col text-center">
|
<div class="col text-center">
|
||||||
<a class="btn btn-green-user" href="{% url 'idhub:user_credential_json' object.id %}">{% trans 'View in JSON format' %}</a>
|
<a class="btn btn-green-user" href="{% url 'idhub:user_credential_json' object.id %}">{% trans 'View in JSON format' %}</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -80,8 +80,12 @@ urlpatterns = [
|
||||||
name='user_credentials'),
|
name='user_credentials'),
|
||||||
path('user/credentials/<int:pk>', views_user.CredentialView.as_view(),
|
path('user/credentials/<int:pk>', views_user.CredentialView.as_view(),
|
||||||
name='user_credential'),
|
name='user_credential'),
|
||||||
path('user/credentials/<int:pk>/json', views_user.CredentialJsonView.as_view(),
|
path('user/credentials/<int:pk>/pdf', views_user.CredentialPdfView.as_view(),
|
||||||
|
name='user_credential_pdf'),
|
||||||
|
path('credentials/<int:pk>/', views_user.CredentialJsonView.as_view(),
|
||||||
name='user_credential_json'),
|
name='user_credential_json'),
|
||||||
|
path('public/credentials/<str:pk>/', views_user.PublicCredentialJsonView.as_view(),
|
||||||
|
name='public_credential_json'),
|
||||||
path('user/credentials/request/',
|
path('user/credentials/request/',
|
||||||
views_user.CredentialsRequestView.as_view(),
|
views_user.CredentialsRequestView.as_view(),
|
||||||
name='user_credentials_request'),
|
name='user_credentials_request'),
|
||||||
|
|
|
@ -14,6 +14,7 @@ from pyhanko import stamp
|
||||||
from pyhanko.pdf_utils import text
|
from pyhanko.pdf_utils import text
|
||||||
from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter
|
from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
from django.views.generic import View
|
||||||
from django.views.generic.edit import (
|
from django.views.generic.edit import (
|
||||||
UpdateView,
|
UpdateView,
|
||||||
CreateView,
|
CreateView,
|
||||||
|
@ -25,6 +26,7 @@ from django.shortcuts import get_object_or_404, redirect
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
|
from django.conf import settings
|
||||||
from idhub.user.forms import (
|
from idhub.user.forms import (
|
||||||
ProfileForm,
|
ProfileForm,
|
||||||
RequestCredentialForm,
|
RequestCredentialForm,
|
||||||
|
@ -125,7 +127,7 @@ class CredentialView(MyWallet, TemplateView):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class CredentialJsonView(MyWallet, TemplateView):
|
class CredentialPdfView(MyWallet, TemplateView):
|
||||||
template_name = "certificates/4_Model_Certificat.html"
|
template_name = "certificates/4_Model_Certificat.html"
|
||||||
subtitle = _('Credential management')
|
subtitle = _('Credential management')
|
||||||
icon = 'bi bi-patch-check-fill'
|
icon = 'bi bi-patch-check-fill'
|
||||||
|
@ -138,11 +140,19 @@ class CredentialJsonView(MyWallet, TemplateView):
|
||||||
self.object = get_object_or_404(
|
self.object = get_object_or_404(
|
||||||
VerificableCredential,
|
VerificableCredential,
|
||||||
pk=pk,
|
pk=pk,
|
||||||
|
public=True,
|
||||||
user=self.request.user
|
user=self.request.user
|
||||||
)
|
)
|
||||||
|
self.url_id = "{}/public/credentials/{}".format(
|
||||||
|
settings.DOMAIN.strip("/"),
|
||||||
|
self.object.hash
|
||||||
|
)
|
||||||
|
|
||||||
data = self.build_certificate()
|
data = self.build_certificate()
|
||||||
|
if DID.objects.filter(eidas1=True).exists():
|
||||||
doc = self.insert_signature(data)
|
doc = self.insert_signature(data)
|
||||||
|
else:
|
||||||
|
doc = data
|
||||||
response = HttpResponse(doc, content_type="application/pdf")
|
response = HttpResponse(doc, content_type="application/pdf")
|
||||||
response['Content-Disposition'] = 'attachment; filename={}'.format(self.file_name)
|
response['Content-Disposition'] = 'attachment; filename={}'.format(self.file_name)
|
||||||
return response
|
return response
|
||||||
|
@ -160,9 +170,7 @@ class CredentialJsonView(MyWallet, TemplateView):
|
||||||
with open(img_header, 'rb') as _f:
|
with open(img_header, 'rb') as _f:
|
||||||
img_head = base64.b64encode(_f.read()).decode('utf-8')
|
img_head = base64.b64encode(_f.read()).decode('utf-8')
|
||||||
|
|
||||||
qr = self.generate_qr_code("http://localhost")
|
qr = self.generate_qr_code(self.url_id)
|
||||||
if DID.objects.filter(eidas1=True).exists():
|
|
||||||
qr = ""
|
|
||||||
|
|
||||||
first_name = self.user.first_name and self.user.first_name.upper() or ""
|
first_name = self.user.first_name and self.user.first_name.upper() or ""
|
||||||
last_name = self.user.first_name and self.user.last_name.upper() or ""
|
last_name = self.user.first_name and self.user.last_name.upper() or ""
|
||||||
|
@ -231,7 +239,6 @@ class CredentialJsonView(MyWallet, TemplateView):
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def insert_signature(self, doc):
|
def insert_signature(self, doc):
|
||||||
# import pdb; pdb.set_trace()
|
|
||||||
sig = self.signer_init()
|
sig = self.signer_init()
|
||||||
if not sig:
|
if not sig:
|
||||||
return
|
return
|
||||||
|
@ -247,18 +254,17 @@ class CredentialJsonView(MyWallet, TemplateView):
|
||||||
|
|
||||||
meta = signers.PdfSignatureMetadata(field_name='Signature')
|
meta = signers.PdfSignatureMetadata(field_name='Signature')
|
||||||
pdf_signer = signers.PdfSigner(
|
pdf_signer = signers.PdfSigner(
|
||||||
meta, signer=sig, stamp_style=stamp.QRStampStyle(
|
meta, signer=sig, stamp_style=stamp.TextStampStyle(
|
||||||
stamp_text='Signed by: %(signer)s\nTime: %(ts)s\nURL: %(url)s',
|
stamp_text='Signed by: %(signer)s\nTime: %(ts)s\nURL: %(url)s',
|
||||||
text_box_style=text.TextBoxStyle()
|
text_box_style=text.TextBoxStyle()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
_bf_out = BytesIO()
|
_bf_out = BytesIO()
|
||||||
url = "https://localhost:8000/"
|
pdf_signer.sign_pdf(w, output=_bf_out, appearance_text_params={'url': self.url_id})
|
||||||
pdf_signer.sign_pdf(w, output=_bf_out, appearance_text_params={'url': url})
|
|
||||||
return _bf_out.read()
|
return _bf_out.read()
|
||||||
|
|
||||||
|
|
||||||
class CredentialJsonView2(MyWallet, TemplateView):
|
class CredentialJsonView(MyWallet, TemplateView):
|
||||||
|
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
pk = kwargs['pk']
|
pk = kwargs['pk']
|
||||||
|
@ -272,6 +278,19 @@ class CredentialJsonView2(MyWallet, TemplateView):
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
class PublicCredentialJsonView(View):
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
pk = kwargs['pk']
|
||||||
|
self.object = get_object_or_404(
|
||||||
|
VerificableCredential,
|
||||||
|
hash=pk,
|
||||||
|
)
|
||||||
|
response = HttpResponse(self.object.data, content_type="application/json")
|
||||||
|
response['Content-Disposition'] = 'attachment; filename={}'.format("credential.json")
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
class CredentialsRequestView(MyWallet, FormView):
|
class CredentialsRequestView(MyWallet, FormView):
|
||||||
template_name = "idhub/user/credentials_request.html"
|
template_name = "idhub/user/credentials_request.html"
|
||||||
subtitle = _('Credential request')
|
subtitle = _('Credential request')
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 4.2.5 on 2024-01-10 11:52
|
# Generated by Django 4.2.5 on 2024-01-11 10:17
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 4.2.5 on 2024-01-10 11:52
|
# Generated by Django 4.2.5 on 2024-01-11 10:17
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 4.2.5 on 2024-01-10 11:52
|
# Generated by Django 4.2.5 on 2024-01-11 10:17
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
|
|
@ -222,3 +222,4 @@ LOGGING = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFAULT_PUBLIC_CREDENTIALS = True
|
||||||
|
|
Loading…
Reference in New Issue