adjust verify signature

This commit is contained in:
Pete Matsyburka
2026-08-12 11:15:43 +03:00
parent e867bf5c48
commit e361cbabf4
5 changed files with 408 additions and 33 deletions
@@ -4,16 +4,16 @@ class VerifyPdfSignatureController < ApplicationController
skip_authorization_check
def create
pdfs =
params[:files].map do |file|
HexaPDF::Document.new(io: file.open)
end
trusted_certs = Accounts.load_trusted_certs(current_account)
signatures =
params[:files].map do |file|
VerifyPdfSignature.call(file.open, trusted_certs)
end
render turbo_stream: turbo_stream.replace('result', partial: 'result',
locals: { pdfs:, files: params[:files], trusted_certs: })
rescue HexaPDF::MalformedPDFError
locals: { signatures:, files: params[:files] })
rescue Pdfium::PdfiumError
render turbo_stream: turbo_stream.replace('result', html: helpers.tag.div(I18n.t('invalid_pdf'), id: 'result'))
end
end
+13 -26
View File
@@ -1,7 +1,7 @@
<div id="result">
<% files.zip(pdfs).each do |file, pdf| %>
<% files.zip(signatures).each do |file, file_signatures| %>
<div class="mb-4 border border-base-300 rounded-md py-2 px-3">
<% if pdf.signatures.to_a.size == 0 %>
<% if file_signatures.size == 0 %>
<div class="text-sm">
<%= file.original_filename %>
</div>
@@ -11,42 +11,29 @@
<% 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><%= file.original_filename %> - <%= pluralize(pdf.signatures.to_a.size, 'Signature') %></span>
<span><%= file.original_filename %> - <%= pluralize(file_signatures.size, 'Signature') %></span>
</div>
<% pdf.signatures.to_a.each do |signature| %>
<% file_signatures.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| %>
<% signature.messages.each do |message| %>
<p class="flex space-x-1 items-center">
<% if message == 'Signature verification failed' %>
<% if message.status == :error %>
<%= svg_icon('x_circle', class: 'w-6 h-6 text-red-500') %>
<% elsif message == 'Signature valid' %>
<% elsif message.status == :success %>
<%= svg_icon('circle_check', class: 'w-6 h-6 text-green-500') %>
<% elsif message.status == :warning %>
<%= svg_icon('alert_circle', class: 'w-6 h-6 text-yellow-500') %>
<% end %>
<span>
<%= message %>
<%= message.text %>
</span>
</p>
<% if message == 'Signature valid' %>
<p class="flex space-x-1 items-center">
<% if trusted_certs.any? { |e| e.public_key.to_der == signature.signature_handler.signer_certificate.public_key.to_der } %>
<%= svg_icon('circle_check', class: 'w-6 h-6 text-green-500') %>
<span>
<%= t('signed_with_trusted_certificate') %>
</span>
<% else %>
<%= svg_icon('x_circle', class: 'w-6 h-6 text-red-500') %>
<span>
<%= t('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>
<span><%= signature.reason %></span>
</div>
<div class="flex items-center space-x-1">
<%= svg_icon('calendar', class: 'w-5 h-5 inline') %>
@@ -54,11 +41,11 @@
</div>
<div class="flex items-center space-x-1">
<%= svg_icon('certificate', class: 'w-5 h-5 inline') %>
<span><%= signature.signer_name.force_encoding('UTF-8') %></span>
<span><%= signature.common_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>
<span><%= signature.type %></span>
</div>
</div>
<% end %>