Browse Source

Fixes #3108 - Allow uploaded S/MIME certificates to download in admin interface (like in other certificate managers).

Rolf Schmidt 4 years ago
parent
commit
37a6a748c9

+ 19 - 3
app/assets/javascripts/app/views/integration/smime_list.jst.eco

@@ -25,9 +25,25 @@
         <td><%- @datetime(cert.not_before_at) %>
         <td><%- @datetime(cert.not_after_at) %>
         <td>
-         <div class="btn btn--text js-remove" title="<%- @Ti('Remove') %>">
-           <%- @Icon('trash') %>
-         </div>
+          <div class="dropdown dropdown--actions">
+            <div class="btn btn--table btn--text btn--secondary js-action" data-toggle="dropdown">
+              <%- @Icon('overflow-button') %>
+            </div>
+            <ul class="dropdown-menu dropdown-menu-right js-table-action-menu" role="menu">
+            <% if cert.private_key: %>
+              <li role="presentation" data-table-action="download-private">
+                <a href="<%= @C('http_type') %>://<%= @C('fqdn') %>/api/v1/integration/smime/private_key_download/<%= cert.id %>" download><%- @Icon('download') %> <%- @T('Download Private Key') %></a>
+              </li>
+            <% end %>
+              <li role="presentation" data-table-action="download-public">
+                <a href="<%= @C('http_type') %>://<%= @C('fqdn') %>/api/v1/integration/smime/certificate_download/<%= cert.id %>" download><%- @Icon('download') %> <%- @T('Download Certificate') %></a>
+              </li>
+              <li role="presentation" class="danger js-remove" data-table-action="remove">
+                <%- @Icon('trash') %> <%- @T('Delete') %>
+              </li>
+            </ul>
+          </div>
+        </td>
     <% end %>
   <% end %>
   </tbody>

+ 22 - 0
app/controllers/integration/smime_controller.rb

@@ -3,6 +3,28 @@
 class Integration::SMIMEController < ApplicationController
   prepend_before_action { authentication_check && authorize! }
 
+  def certificate_download
+    cert = SMIMECertificate.find(params[:id])
+
+    send_data(
+      cert.raw,
+      filename:    "#{cert.doc_hash}.crt",
+      type:        'text/plain',
+      disposition: 'attachment'
+    )
+  end
+
+  def private_key_download
+    cert = SMIMECertificate.find(params[:id])
+
+    send_data(
+      cert.private_key,
+      filename:    "#{cert.doc_hash}.key",
+      type:        'text/plain',
+      disposition: 'attachment'
+    )
+  end
+
   def certificate_list
     render json: SMIMECertificate.all
   end

+ 8 - 6
config/routes/integration_smime.rb

@@ -1,10 +1,12 @@
 Zammad::Application.routes.draw do
   api_path = Rails.configuration.api_path
 
-  match api_path + '/integration/smime',                        to: 'integration/smime#search',                   via: :post
-  match api_path + '/integration/smime/certificate',            to: 'integration/smime#certificate_add',          via: :post
-  match api_path + '/integration/smime/certificate',            to: 'integration/smime#certificate_delete',       via: :delete
-  match api_path + '/integration/smime/certificate',            to: 'integration/smime#certificate_list',         via: :get
-  match api_path + '/integration/smime/private_key',            to: 'integration/smime#private_key_add',          via: :post
-  match api_path + '/integration/smime/private_key',            to: 'integration/smime#private_key_delete',       via: :delete
+  match api_path + '/integration/smime',                           to: 'integration/smime#search',                   via: :post
+  match api_path + '/integration/smime/certificate',               to: 'integration/smime#certificate_add',          via: :post
+  match api_path + '/integration/smime/certificate',               to: 'integration/smime#certificate_delete',       via: :delete
+  match api_path + '/integration/smime/certificate',               to: 'integration/smime#certificate_list',         via: :get
+  match api_path + '/integration/smime/private_key',               to: 'integration/smime#private_key_add',          via: :post
+  match api_path + '/integration/smime/private_key',               to: 'integration/smime#private_key_delete',       via: :delete
+  match api_path + '/integration/smime/certificate_download/:id',  to: 'integration/smime#certificate_download',     via: :get
+  match api_path + '/integration/smime/private_key_download/:id',  to: 'integration/smime#private_key_download',     via: :get
 end