198 lines
5.9 KiB
Ruby
198 lines
5.9 KiB
Ruby
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
|
|
require 'rails_helper'
|
|
|
|
RSpec.describe 'Integration SMIME', type: :request do
|
|
|
|
let(:admin) { create(:admin) }
|
|
let(:email_address) { 'smime1@example.com' }
|
|
|
|
before do
|
|
authenticated_as(admin)
|
|
end
|
|
|
|
describe '/integration/smime/certificate' do
|
|
|
|
let(:endpoint) { '/api/v1/integration/smime/certificate' }
|
|
|
|
let(:certificate_path) do
|
|
Rails.root.join("spec/fixtures/smime/#{email_address}.crt")
|
|
end
|
|
let(:certificate_string) do
|
|
File.read(certificate_path)
|
|
end
|
|
|
|
context 'POST requests' do
|
|
|
|
let(:parsed_certificate) { SMIMECertificate.parse(certificate_string) }
|
|
|
|
it 'adds certificate by string' do
|
|
expect do
|
|
post endpoint, params: { data: certificate_string }, as: :json
|
|
end.to change(SMIMECertificate, :count).by(1)
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(DateTime.parse(json_response['response'][0]['not_after_at'])).to eq(parsed_certificate.not_after)
|
|
end
|
|
|
|
it 'adds certificate by file' do
|
|
expect do
|
|
post endpoint, params: { file: Rack::Test::UploadedFile.new(certificate_path, 'text/plain', true) }
|
|
end.to change(SMIMECertificate, :count).by(1)
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(DateTime.parse(json_response['response'][0]['not_after_at'])).to eq(parsed_certificate.not_after)
|
|
end
|
|
end
|
|
|
|
context 'GET requests' do
|
|
|
|
let!(:certificate) { create(:smime_certificate, fixture: email_address) }
|
|
|
|
it 'lists certificates' do
|
|
get endpoint, as: :json
|
|
expect(response).to have_http_status(:ok)
|
|
|
|
expect(json_response.any? { |e| e['id'] == certificate.id }).to be true
|
|
end
|
|
end
|
|
|
|
context 'DELETE requests' do
|
|
|
|
let!(:certificate) { create(:smime_certificate, fixture: email_address) }
|
|
|
|
it 'deletes certificate' do
|
|
expect do
|
|
delete endpoint, params: { id: certificate.id }, as: :json
|
|
end.to change(SMIMECertificate, :count).by(-1)
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '/integration/smime/private_key' do
|
|
|
|
let(:endpoint) { '/api/v1/integration/smime/private_key' }
|
|
|
|
context 'POST requests' do
|
|
|
|
let(:private_path) do
|
|
Rails.root.join("spec/fixtures/smime/#{email_address}.key")
|
|
end
|
|
|
|
let(:private_string) { File.read(private_path) }
|
|
|
|
let(:secret) do
|
|
File.read(Rails.root.join("spec/fixtures/smime/#{email_address}.secret")).strip
|
|
end
|
|
|
|
let!(:certificate) { create(:smime_certificate, fixture: email_address) }
|
|
|
|
it 'adds by string' do
|
|
expect do
|
|
post endpoint, params: { data: private_string, secret: secret }, as: :json
|
|
end.to change {
|
|
certificate.reload
|
|
certificate.private_key
|
|
}
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(json_response['result']).to eq('ok')
|
|
end
|
|
|
|
it 'adds by file' do
|
|
expect do
|
|
post endpoint, params: { file: Rack::Test::UploadedFile.new(private_path, 'text/plain', true), secret: secret }
|
|
end.to change {
|
|
certificate.reload
|
|
certificate.private_key
|
|
}
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(json_response['result']).to eq('ok')
|
|
end
|
|
end
|
|
|
|
context 'DELETE requests' do
|
|
|
|
let!(:certificate) { create(:smime_certificate, :with_private, fixture: email_address) }
|
|
|
|
it 'deletes private key' do
|
|
expect do
|
|
delete endpoint, params: { id: certificate.id }, as: :json
|
|
end.to change {
|
|
certificate.reload
|
|
certificate.private_key
|
|
}.to(nil)
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '/integration/smime' do
|
|
|
|
let(:endpoint) { '/api/v1/integration/smime' }
|
|
|
|
context 'POST requests' do
|
|
|
|
let(:system_email_address) { create(:email_address, email: email_address) }
|
|
let(:group) { create(:group, email_address: system_email_address) }
|
|
|
|
let(:search_query) do
|
|
{
|
|
article: {
|
|
to: email_address,
|
|
},
|
|
ticket: {
|
|
group_id: group.id,
|
|
},
|
|
}
|
|
end
|
|
|
|
context 'certificate not present' do
|
|
it 'does not find non existing certificates' do
|
|
post endpoint, params: search_query, as: :json
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(json_response['encryption']['success']).to eq(false)
|
|
expect(json_response['encryption']['comment']).to include(email_address)
|
|
expect(json_response['sign']['success']).to eq(false)
|
|
expect(json_response['sign']['comment']).to include(email_address)
|
|
end
|
|
end
|
|
|
|
context 'certificate present' do
|
|
|
|
before do
|
|
create(:smime_certificate, :with_private, fixture: email_address)
|
|
end
|
|
|
|
it 'finds existing certificate' do
|
|
post endpoint, params: search_query, as: :json
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(json_response['encryption']['success']).to eq(true)
|
|
expect(json_response['encryption']['comment']).to include(email_address)
|
|
expect(json_response['sign']['success']).to eq(true)
|
|
expect(json_response['sign']['comment']).to include(email_address)
|
|
end
|
|
|
|
context 'but expired' do
|
|
let(:email_address) { 'expiredsmime1@example.com' }
|
|
|
|
it 'finds existing certificate with comment' do
|
|
post endpoint, params: search_query, as: :json
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(json_response['encryption']['success']).to eq(false)
|
|
expect(json_response['encryption']['comment']).to include(email_address).and include('expired')
|
|
expect(json_response['sign']['success']).to eq(false)
|
|
expect(json_response['sign']['comment']).to include(email_address).and include('expired')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|