add signature verification

This commit is contained in:
Alex Turchyn
2023-06-24 12:27:34 +03:00
parent 0ac30a5fc0
commit c9e255f589
19 changed files with 231 additions and 61 deletions
+68
View File
@@ -0,0 +1,68 @@
<div id="result">
<% blobs.zip(pdfs).each do |blob, pdf| %>
<div class="mb-4 border border-base-300 rounded-md py-2 px-3">
<% if pdf.signatures.to_a.size == 0 %>
<div class="text-sm">
<%= blob.filename %>
</div>
<p class="text-xl font-medium">
There are no signatures...
</p>
<% else %>
<div class="flex items-center space-x-1 border-b border-dashed border-base-300 pb-2">
<%= svg_icon('file_text', class: 'w-5 h-5 inline') %>
<span><%= blob.filename %> - <%= pluralize(pdf.signatures.to_a.size, 'Signature') %></span>
</div>
<% pdf.signatures.to_a.each do |signature| %>
<div class="mt-3">
<div class="space-y-1 font-medium pb-2 text-xl">
<% signature.verify(trusted_certs:).messages.map(&:content).each do |message| %>
<p class="flex space-x-1 items-center">
<% if message == 'Signature verification failed' %>
<%= svg_icon('x_circle', class: 'w-6 h-6 text-red-500') %>
<% elsif message == 'Signature valid' %>
<%= svg_icon('circle_check', class: 'w-6 h-6 text-green-500') %>
<% end %>
<span>
<%= message %>
</span>
</p>
<% if message == 'Signature valid' %>
<p class="flex space-x-1 items-center">
<% if signature.signature_handler.signer_certificate.public_key.to_der == trusted_certs.first.public_key.to_der %>
<%= svg_icon('circle_check', class: 'w-6 h-6 text-green-500') %>
<span>
Signed with DocuSeal Certificate
</span>
<% else %>
<%= svg_icon('x_circle', class: 'w-6 h-6 text-red-500') %>
<span>
Signed with External Certificate
</span>
<% end %>
</p>
<% end %>
<% end %>
</div>
<div class="flex items-center space-x-1">
<%= svg_icon('user', class: 'w-5 h-5 inline') %>
<span><%= signature.signing_reason %></span>
</div>
<div class="flex items-center space-x-1">
<%= svg_icon('calendar', class: 'w-5 h-5 inline') %>
<span><%= l(signature.signing_time, format: :long) %></span>
</div>
<div class="flex items-center space-x-1">
<%= svg_icon('certificate', class: 'w-5 h-5 inline') %>
<span><%= signature.signer_name %></span>
</div>
<div class="flex items-center space-x-1">
<%= svg_icon('lock_access', class: 'w-5 h-5 inline') %>
<span><%= signature.signature_type %></span>
</div>
</div>
<% end %>
<% end %>
</div>
<% end %>
</div>
+31 -10
View File
@@ -1,19 +1,40 @@
<div class="flex flex-wrap space-y-4 md:flex-nowrap md:space-y-0">
<%= render 'shared/settings_nav' %>
<div class="flex-grow max-w-xl mx-auto">
<h1 class="text-4xl font-bold mb-4">eSign</h1>
<p>
Upload your electronic signature
</p>
<h1 class="text-4xl font-bold mb-4">Verify PDF Signature</h1>
<div id="result">
<p class="mb-2">
Upload signed PDF file to validate its signature:
</p>
</div>
<%= form_for '', url: settings_esign_index_path, method: :post do |f| %>
<file-dropzone data-name="verify_attachments" class="">
<label for="file">
<input id="attachment_uuid" name="attachment_uuid" class="hidden" data-target="file-dropzone.valueField" type="text" autocomplete="off">
<input id="file" class="hidden" data-action="change:file-dropzone#onSelectFiles" data-target="file-dropzone.input" type="file">
Cick to upload
<%= f.button type: 'submit', class: 'flex' do %>
<div class="disabled mb-3">
<%= svg_icon('loader', class: 'w-5 h-5 animate-spin inline') %>
Analyzing...
</div>
<% end %>
<file-dropzone data-name="verify_attachments" data-submit-on-upload="true" class="w-full">
<label for="file" class="w-full block h-32 relative bg-base-300 hover:bg-base-200 rounded-md border border-base-content border-dashed">
<div class="absolute top-0 right-0 left-0 bottom-0 flex items-center justify-center">
<div class="flex flex-col items-center">
<span data-target="file-dropzone.icon">
<%= svg_icon('cloud_upload', class: 'w-10 h-10') %>
</span>
<span data-target="file-dropzone.loading" class="hidden">
<%= svg_icon('loader', class: 'w-10 h-10 animate-spin') %>
</span>
<div class="font-medium mb-1">
Verify Signed PDF
</div>
<div class="text-xs">
<span class="font-medium">Click to upload</span> or drag and drop
</div>
</div>
<input id="file" class="hidden" data-action="change:file-dropzone#onSelectFiles" data-target="file-dropzone.input" type="file" accept="application/pdf" multiple>
</div>
</label>
</file-dropzone>
<%= f.button button_title(title: 'Save', disabled_with: 'Saving') %>
<% end %>
</div>
<div class="w-0 md:w-52"></div>