def self.cert_names(request)
client_cert = request.env['SSL_CLIENT_CERT']
raise AbrtProxy::Error::Unauthorized, "Client certificate required" if client_cert.to_s.empty?
begin
client_cert = OpenSSL::X509::Certificate.new(client_cert)
rescue OpenSSL::OpenSSLError => e
raise AbrtProxy::Error::CertificateError, e.message
end
begin
cn = client_cert.subject.to_a.find { |name, value| name == 'CN' }
names = [cn[1]]
rescue NoMethodError
raise AbrtProxy::Error::CertificateError, "Common Name not found in the certificate"
end
alt_name_ext = client_cert.extensions.find { |ext| ext.oid == 'subjectAltName' }
if alt_name_ext
names += alt_name_ext.value.
split(/, ?/).
select { |s| s.start_with? 'URI:CN=' }.
map { |s| s.sub(/^URI:CN=/, '') }
end
return names
end