From 2b334536df13b652dc92daa2af417f520a9eaa57 Mon Sep 17 00:00:00 2001 From: besermenji Date: Tue, 5 Jul 2016 21:30:57 +0200 Subject: [PATCH] Pdf files are now signed --- Gemfile | 1 + Gemfile.lock | 2 + pdf_test2016-06-26 14:46:02 UTC | Bin 15054 -> 0 bytes report_generator.rb | 75 ++++++++++++++++++++++++++++++-- 4 files changed, 74 insertions(+), 4 deletions(-) delete mode 100644 pdf_test2016-06-26 14:46:02 UTC diff --git a/Gemfile b/Gemfile index 4371548..9264c4d 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,7 @@ gem 'sinatra' # Gems for pdf generation gem 'pdfkit' gem 'wkhtmltopdf-binary' +gem 'origami' group :development, :test do gem 'awesome_print' diff --git a/Gemfile.lock b/Gemfile.lock index 2c63c6f..b857d80 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -15,6 +15,7 @@ GEM mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) + origami (1.2.7) pdfkit (0.8.2) pony (1.11) mail (>= 2.0) @@ -47,6 +48,7 @@ PLATFORMS DEPENDENCIES awesome_print letter_opener + origami pdfkit pony pry diff --git a/pdf_test2016-06-26 14:46:02 UTC b/pdf_test2016-06-26 14:46:02 UTC deleted file mode 100644 index daed3f21c09d6fbdb37ec16849ee515ae19b8a68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15054 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 'noreply@receipt-yourself.com', :subject => 'hi', :body => "Hello there. It is #{DateTime.now}. Enjoy your KIF report.", - :attachments => {"KIF_report_#{DateTime.now}.pdf" => File.read(@file)}) - + :attachments => {"KIF_report_#{DateTime.now}.pdf" => File.read(@output_file)}) status 200 end @@ -39,7 +41,7 @@ class ReportGenerator < Sinatra::Base :from => 'noreply@receipt-yourself.com', :subject => 'hi', :body => "Hello there. It is #{DateTime.now}. Enjoy your KUF report.", - :attachments => {"KUF_report_#{DateTime.now}.pdf" => File.read(@file)}) + :attachments => {"KUF_report_#{DateTime.now}.pdf" => File.read(@output_file)}) status 200 end @@ -74,6 +76,71 @@ def generate_pdf(pdf_path) headers['Content-Type'] = 'application/pdf' @file_name = "pdf_test#{Time.now.getutc}" @file = kit.to_file(@file_name) + sign_pdf + end + + def sign_pdf + # Code below is based on documentation available on + # http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL.html + key = OpenSSL::PKey::RSA.new 2048 + + open 'private_key.pem', 'w' do |io| io.write key.to_pem end + open 'public_key.pem', 'w' do |io| io.write key.public_key.to_pem end + + cipher = OpenSSL::Cipher::Cipher.new 'AES-128-CBC' + pass_phrase = if ENV['RACK_ENV'] == 'production' + ENV['PDF_PASSWORD'] + else + "admin" + end + + key_secure = key.export cipher, pass_phrase + + open 'private_key.pem', 'w' do |io| + io.write key_secure + end + + #Create the certificate + + name = OpenSSL::X509::Name.parse 'CN=PDF_signature' + + cert = OpenSSL::X509::Certificate.new + cert.version = 2 + cert.serial = 0 + cert.not_before = Time.now + cert.not_after = Time.now + 3600 + + cert.public_key = key.public_key + cert.subject = name + + + @output_file = "pdf_signed_test#{Time.now.getutc}" + + contents = ContentStream.new.setFilter(:FlateDecode) + contents.write @output_file, + :x => 350, + :y => 750, + :rendering => Text::Rendering::STROKE, + :size => 30 + + @pdf = PDF.read(@file) + + sigannot = Annotation::Widget::Signature.new + sigannot.Rect = Rectangle[:llx => 89.0, :lly => 386.0, :urx => 190.0, :ury => 353.0] + page = @pdf.get_page(1) + page.add_annot(sigannot) + + # Sign the PDF with the specified keys + @pdf.sign(cert, key, + :method => 'adbe.pkcs7.sha1', + :annotation => sigannot, + :location => "Serbia", + :contact => "besermenji@receiptyourself.com", + :reason => "Proof of Concept" + ) + + # Save the resulting file + @pdf.save(@output_file) end end \ No newline at end of file