diff options
| author | Azul <azul@leap.se> | 2013-02-25 13:01:07 +0100 | 
|---|---|---|
| committer | Azul <azul@leap.se> | 2013-02-25 13:01:07 +0100 | 
| commit | d99bcf4b0d0b8716ab0da58ea7320fb33bac78bb (patch) | |
| tree | b2395a926fa606adfb59dab6fd10234d9b0ae823 | |
| parent | a314d1265bcf7b0c6dd66d61d03e1d2a7545cfb8 (diff) | |
enable free certs with a common name postfix
| -rw-r--r-- | certs/app/controllers/certs_controller.rb | 2 | ||||
| -rw-r--r-- | certs/app/models/client_certificate.rb | 22 | ||||
| -rw-r--r-- | certs/test/functional/certs_controller_test.rb | 8 | ||||
| -rw-r--r-- | certs/test/unit/client_certificate_test.rb | 23 | ||||
| -rw-r--r-- | config/defaults.yml | 1 | 
5 files changed, 40 insertions, 16 deletions
| diff --git a/certs/app/controllers/certs_controller.rb b/certs/app/controllers/certs_controller.rb index 6099ac0..3b7d35d 100644 --- a/certs/app/controllers/certs_controller.rb +++ b/certs/app/controllers/certs_controller.rb @@ -3,7 +3,7 @@ class CertsController < ApplicationController    # GET /cert    def show      @cert = ClientCertificate.new(free: !logged_in?) -    render :text => @cert.key + @cert.cert, :content_type => 'text/plain' +    render text: @cert.to_s, content_type: 'text/plain'    end  end diff --git a/certs/app/models/client_certificate.rb b/certs/app/models/client_certificate.rb index be0ac63..3a82d1a 100644 --- a/certs/app/models/client_certificate.rb +++ b/certs/app/models/client_certificate.rb @@ -1,5 +1,5 @@  # -# Model for certificates stored in CouchDB. +# Model for certificates  #  # This file must be loaded after Config has been loaded.  # @@ -17,11 +17,11 @@ class ClientCertificate    #    # generate the private key and client certificate    # -  def initialize +  def initialize(options = {})      cert = CertificateAuthority::Certificate.new      # set subject -    cert.subject.common_name = random_common_name +    cert.subject.common_name = common_name(options[:free])      # set expiration      cert.not_before = yesterday @@ -35,8 +35,12 @@ class ClientCertificate      cert.parent = ClientCertificate.root_ca      cert.sign! client_signing_profile -    self.key = cert.key_material.private_key.to_pem -    self.cert = cert.to_pem +    self.key = cert.key_material.private_key +    self.cert = cert +  end + +  def to_s +    self.key.to_pem + self.cert.to_pem    end    private @@ -61,6 +65,14 @@ class ClientCertificate      Digest::MD5.hexdigest("#{rand(10**10)} -- #{Time.now}").to_i(16)    end +  def common_name(for_free_cert = false) +    if for_free_cert +      random_common_name + ' ' + APP_CONFIG[:free_cert_postfix] +    else +      random_common_name +    end +  end +    #    # for the random common name, we need a text string that will be unique across all certs.    # ruby 1.8 doesn't have a built-in uuid generator, or we would use SecureRandom.uuid diff --git a/certs/test/functional/certs_controller_test.rb b/certs/test/functional/certs_controller_test.rb index 6ebd08e..a579a00 100644 --- a/certs/test/functional/certs_controller_test.rb +++ b/certs/test/functional/certs_controller_test.rb @@ -5,19 +5,19 @@ class CertsControllerTest < ActionController::TestCase    end    test "should send free cert without login" do -    cert = stub :cert => "free cert", :key => "key" +    cert = stub :to_s => "free cert"      ClientCertificate.expects(:new).with(free: true).returns(cert)      get :show      assert_response :success -    assert_equal cert.key + cert.cert, @response.body +    assert_equal cert.to_s, @response.body    end    test "should send cert" do      login -    cert = stub :cert => "adsf", :key => "key" +    cert = stub :to_s => "real cert"      ClientCertificate.expects(:new).with(free: false).returns(cert)      get :show      assert_response :success -    assert_equal cert.key + cert.cert, @response.body +    assert_equal cert.to_s, @response.body    end  end diff --git a/certs/test/unit/client_certificate_test.rb b/certs/test/unit/client_certificate_test.rb index 71a1d90..bcc61cc 100644 --- a/certs/test/unit/client_certificate_test.rb +++ b/certs/test/unit/client_certificate_test.rb @@ -2,17 +2,28 @@ require 'test_helper'  class ClientCertificateTest < ActiveSupport::TestCase -  setup do -    @sample = ClientCertificate.new +  test "new cert has all we need" do +    sample = ClientCertificate.new +    assert sample.key +    assert sample.cert +    assert sample.to_s    end -  test "new cert has all we need" do -    assert @sample.key -    assert @sample.cert +  test "free cert has configured postfix" do +    sample = ClientCertificate.new(free: true) +    postfix = APP_CONFIG[:free_cert_postfix] +    assert sample.cert.subject.common_name.include?(postfix) +  end + +  test "real cert has no free cert postfix" do +    sample = ClientCertificate.new +    postfix = APP_CONFIG[:free_cert_postfix] +    assert !sample.cert.subject.common_name.include?(postfix)    end    test "cert issuer matches ca subject" do -    cert = OpenSSL::X509::Certificate.new(@sample.cert) +    sample = ClientCertificate.new +    cert = OpenSSL::X509::Certificate.new(sample.cert.to_pem)      assert_equal ClientCertificate.root_ca.openssl_body.subject, cert.issuer    end diff --git a/config/defaults.yml b/config/defaults.yml index cb8a627..18825dd 100644 --- a/config/defaults.yml +++ b/config/defaults.yml @@ -7,6 +7,7 @@ cert_options: &cert_options    client_cert_lifespan: 2    client_cert_bit_size: 2024    client_cert_hash: "SHA256" +  free_cert_postfix: "*Free Cert*"  development:    <<: *dev_ca | 
