ezcrypto2 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG +85 -0
- data/MIT-LICENSE +21 -0
- data/README.rdoc +152 -0
- data/README_ACTIVE_CRYPTO +122 -0
- data/README_DIGITAL_SIGNATURES +55 -0
- data/init.rb +1 -0
- data/lib/active_crypto.rb +325 -0
- data/lib/ezcrypto2.rb +610 -0
- data/lib/ezsig.rb +535 -0
- data/lib/trusted.pem +2363 -0
- data/rakefile +200 -0
- data/test/active_crypto_test.rb +211 -0
- data/test/agree2.com.cert +31 -0
- data/test/association_key_holder_test.rb +38 -0
- data/test/database.yml +18 -0
- data/test/digest_test.rb +51 -0
- data/test/dsakey.pem +12 -0
- data/test/dsapubkey.pem +12 -0
- data/test/dsig_test.rb +288 -0
- data/test/encrypt_test.rb +41 -0
- data/test/ezcrypto_test.rb +212 -0
- data/test/key_holder_test.rb +44 -0
- data/test/protectedsigner.pem +12 -0
- data/test/sf_intermediate.crt +29 -0
- data/test/test_helper.rb +35 -0
- data/test/testchild.pem +15 -0
- data/test/testchild.req +12 -0
- data/test/testpub.pem +4 -0
- data/test/testsigner.cert +20 -0
- data/test/testsigner.pem +9 -0
- data/test/valicert_class2_root.crt +18 -0
- metadata +99 -0
    
        data/rakefile
    ADDED
    
    | @@ -0,0 +1,200 @@ | |
| 1 | 
            +
            require 'rubygems'
         | 
| 2 | 
            +
            require 'rake'
         | 
| 3 | 
            +
            require 'rake/testtask'
         | 
| 4 | 
            +
            require 'rake/rdoctask'
         | 
| 5 | 
            +
            require 'rake/packagetask'
         | 
| 6 | 
            +
            require 'rake/gempackagetask'
         | 
| 7 | 
            +
            require 'rake/contrib/rubyforgepublisher'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            PKG_BUILD     = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
         | 
| 10 | 
            +
            PKG_NAME      = 'ezcrypto'
         | 
| 11 | 
            +
            PKG_VERSION   = '0.7.2' + PKG_BUILD
         | 
| 12 | 
            +
            PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            RELEASE_NAME  = "REL #{PKG_VERSION}"
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            RUBY_FORGE_PROJECT = "ezcrypto"
         | 
| 17 | 
            +
            RUBY_FORGE_USER    = "pelleb"
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            desc "Default Task"
         | 
| 20 | 
            +
            task :default => [ :test ]
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            # Run the unit tests
         | 
| 23 | 
            +
            Rake::TestTask.new { |t|
         | 
| 24 | 
            +
              t.libs << "test"
         | 
| 25 | 
            +
              t.pattern = 'test/*_test.rb'
         | 
| 26 | 
            +
              t.verbose = true
         | 
| 27 | 
            +
            }
         | 
| 28 | 
            +
             | 
| 29 | 
            +
             | 
| 30 | 
            +
            # Genereate the RDoc documentation
         | 
| 31 | 
            +
            Rake::RDocTask.new { |rdoc|
         | 
| 32 | 
            +
              rdoc.rdoc_dir = 'doc'
         | 
| 33 | 
            +
              rdoc.title    = "EzCrypto - Simplified Crypto Library"
         | 
| 34 | 
            +
            #  rdoc.options << '--line-numbers --inline-source --main README #--template=jamis'
         | 
| 35 | 
            +
              rdoc.template = "#{ENV['template']}.rb" if ENV['template']
         | 
| 36 | 
            +
              rdoc.rdoc_files.include('README.rdoc')
         | 
| 37 | 
            +
              rdoc.rdoc_files.include('README_ACTIVE_CRYPTO')
         | 
| 38 | 
            +
              rdoc.rdoc_files.include('README_DIGITAL_SIGNATURES')
         | 
| 39 | 
            +
              rdoc.rdoc_files.include('CHANGELOG')
         | 
| 40 | 
            +
              rdoc.rdoc_files.include('lib/*.rb')
         | 
| 41 | 
            +
            }
         | 
| 42 | 
            +
             | 
| 43 | 
            +
             | 
| 44 | 
            +
            # Create compressed packages
         | 
| 45 | 
            +
            spec = Gem::Specification.new do |s|
         | 
| 46 | 
            +
              s.platform = Gem::Platform::RUBY
         | 
| 47 | 
            +
              s.name = PKG_NAME
         | 
| 48 | 
            +
              s.summary = "Simplified encryption library."
         | 
| 49 | 
            +
              s.description = %q{Makes it easier and safer to write crypto code.}
         | 
| 50 | 
            +
              s.version = PKG_VERSION
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              s.author = "Pelle Braendgaard"
         | 
| 53 | 
            +
              s.email = "pelle@stakeventures.com"
         | 
| 54 | 
            +
              s.rubyforge_project = "ezcrypto"
         | 
| 55 | 
            +
              s.homepage = "http://ezcrypto.rubyforge.org"
         | 
| 56 | 
            +
             | 
| 57 | 
            +
             | 
| 58 | 
            +
              s.has_rdoc = true
         | 
| 59 | 
            +
              s.requirements << 'none'
         | 
| 60 | 
            +
              s.require_path = 'lib'
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              s.files = [ "rakefile", "README.rdoc", "README_ACTIVE_CRYPTO", "README_DIGITAL_SIGNATURES", "MIT-LICENSE","CHANGELOG","init.rb" ]
         | 
| 63 | 
            +
              ["lib","test"].each do |dir|
         | 
| 64 | 
            +
              		s.files = s.files + Dir.glob( "#{dir}/*" )
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
              s.extra_rdoc_files = ["CHANGELOG", "README.rdoc","README_ACTIVE_CRYPTO","README_DIGITAL_SIGNATURES"]
         | 
| 67 | 
            +
              s.test_files = Dir.glob("test/*")
         | 
| 68 | 
            +
            end
         | 
| 69 | 
            +
              
         | 
| 70 | 
            +
            Rake::GemPackageTask.new(spec) do |p|
         | 
| 71 | 
            +
              p.gem_spec = spec
         | 
| 72 | 
            +
              p.need_tar = true
         | 
| 73 | 
            +
              p.need_zip = true
         | 
| 74 | 
            +
            end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
             | 
| 77 | 
            +
            desc "Publish the GEM"
         | 
| 78 | 
            +
            task :pgem => [:package] do 
         | 
| 79 | 
            +
              Rake::SshFilePublisher.new("pelleb@rubyforge.org", "/var/www/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
         | 
| 80 | 
            +
            end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            desc "Publish the API documentation"
         | 
| 83 | 
            +
            task :pdoc => [:rdoc] do 
         | 
| 84 | 
            +
              Rake::SshDirPublisher.new("pelleb@rubyforge.org", "/var/www/gforge-projects/ezcrypto", "doc").upload
         | 
| 85 | 
            +
            end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
            desc "Publish the release files to RubyForge."
         | 
| 88 | 
            +
            task :rubyforge_upload => :package do
         | 
| 89 | 
            +
              files = %w(gem tgz zip).map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" }
         | 
| 90 | 
            +
             | 
| 91 | 
            +
              if RUBY_FORGE_PROJECT then
         | 
| 92 | 
            +
                require 'net/http'
         | 
| 93 | 
            +
                require 'open-uri'
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/"
         | 
| 96 | 
            +
                project_data = open(project_uri) { |data| data.read }
         | 
| 97 | 
            +
                group_id = project_data[/[?&]group_id=(\d+)/, 1]
         | 
| 98 | 
            +
                raise "Couldn't get group id" unless group_id
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                # This echos password to shell which is a bit sucky
         | 
| 101 | 
            +
                if ENV["RUBY_FORGE_PASSWORD"]
         | 
| 102 | 
            +
                  password = ENV["RUBY_FORGE_PASSWORD"]
         | 
| 103 | 
            +
                else
         | 
| 104 | 
            +
                  print "#{RUBY_FORGE_USER}@rubyforge.org's password: "
         | 
| 105 | 
            +
                  password = STDIN.gets.chomp
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                login_response = Net::HTTP.start("rubyforge.org", 80) do |http|
         | 
| 109 | 
            +
                  data = [
         | 
| 110 | 
            +
                    "login=1",
         | 
| 111 | 
            +
                    "form_loginname=#{RUBY_FORGE_USER}",
         | 
| 112 | 
            +
                    "form_pw=#{password}"
         | 
| 113 | 
            +
                  ].join("&")
         | 
| 114 | 
            +
                  http.post("/account/login.php", data)
         | 
| 115 | 
            +
                end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                cookie = login_response["set-cookie"]
         | 
| 118 | 
            +
                raise "Login failed" unless cookie
         | 
| 119 | 
            +
                headers = { "Cookie" => cookie }
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"
         | 
| 122 | 
            +
                release_data = open(release_uri, headers) { |data| data.read }
         | 
| 123 | 
            +
                package_id = release_data[/[?&]package_id=(\d+)/, 1]
         | 
| 124 | 
            +
                raise "Couldn't get package id" unless package_id
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                first_file = true
         | 
| 127 | 
            +
                release_id = ""
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                files.each do |filename|
         | 
| 130 | 
            +
                  basename  = File.basename(filename)
         | 
| 131 | 
            +
                  file_ext  = File.extname(filename)
         | 
| 132 | 
            +
                  file_data = File.open(filename, "rb") { |file| file.read }
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                  puts "Releasing #{basename}..."
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                  release_response = Net::HTTP.start("rubyforge.org", 80) do |http|
         | 
| 137 | 
            +
                    release_date = Time.now.strftime("%Y-%m-%d %H:%M")
         | 
| 138 | 
            +
                    type_map = {
         | 
| 139 | 
            +
                      ".zip"    => "3000",
         | 
| 140 | 
            +
                      ".tgz"    => "3110",
         | 
| 141 | 
            +
                      ".gz"     => "3110",
         | 
| 142 | 
            +
                      ".gem"    => "1400"
         | 
| 143 | 
            +
                    }; type_map.default = "9999"
         | 
| 144 | 
            +
                    type = type_map[file_ext]
         | 
| 145 | 
            +
                    boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                    query_hash = if first_file then
         | 
| 148 | 
            +
                      {
         | 
| 149 | 
            +
                        "group_id" => group_id,
         | 
| 150 | 
            +
                        "package_id" => package_id,
         | 
| 151 | 
            +
                        "release_name" => PKG_FILE_NAME,
         | 
| 152 | 
            +
                        "release_date" => release_date,
         | 
| 153 | 
            +
                        "type_id" => type,
         | 
| 154 | 
            +
                        "processor_id" => "8000", # Any
         | 
| 155 | 
            +
                        "release_notes" => "",
         | 
| 156 | 
            +
                        "release_changes" => "",
         | 
| 157 | 
            +
                        "preformatted" => "1",
         | 
| 158 | 
            +
                        "submit" => "1"
         | 
| 159 | 
            +
                      }
         | 
| 160 | 
            +
                    else
         | 
| 161 | 
            +
                      {
         | 
| 162 | 
            +
                        "group_id" => group_id,
         | 
| 163 | 
            +
                        "release_id" => release_id,
         | 
| 164 | 
            +
                        "package_id" => package_id,
         | 
| 165 | 
            +
                        "step2" => "1",
         | 
| 166 | 
            +
                        "type_id" => type,
         | 
| 167 | 
            +
                        "processor_id" => "8000", # Any
         | 
| 168 | 
            +
                        "submit" => "Add This File"
         | 
| 169 | 
            +
                      }
         | 
| 170 | 
            +
                    end
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                    query = "?" + query_hash.map do |(name, value)|
         | 
| 173 | 
            +
                      [name, URI.encode(value)].join("=")
         | 
| 174 | 
            +
                    end.join("&")
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                    data = [
         | 
| 177 | 
            +
                      "--" + boundary,
         | 
| 178 | 
            +
                      "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",
         | 
| 179 | 
            +
                      "Content-Type: application/octet-stream",
         | 
| 180 | 
            +
                      "Content-Transfer-Encoding: binary",
         | 
| 181 | 
            +
                      "", file_data, ""
         | 
| 182 | 
            +
                      ].join("\x0D\x0A")
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                    release_headers = headers.merge(
         | 
| 185 | 
            +
                      "Content-Type" => "multipart/form-data; boundary=#{boundary}"
         | 
| 186 | 
            +
                    )
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                    target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
         | 
| 189 | 
            +
                    http.post(target + query, data, release_headers)
         | 
| 190 | 
            +
                  end
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                  if first_file then
         | 
| 193 | 
            +
                    release_id = release_response.body[/release_id=(\d+)/, 1]
         | 
| 194 | 
            +
                    raise("Couldn't get release id") unless release_id
         | 
| 195 | 
            +
                  end
         | 
| 196 | 
            +
             | 
| 197 | 
            +
                  first_file = false
         | 
| 198 | 
            +
                end
         | 
| 199 | 
            +
              end
         | 
| 200 | 
            +
            end
         | 
| @@ -0,0 +1,211 @@ | |
| 1 | 
            +
            $:.unshift(File.dirname(__FILE__) + "/../lib/")
         | 
| 2 | 
            +
            require File.join(File.dirname(__FILE__), 'test_helper')
         | 
| 3 | 
            +
            require 'test/unit'
         | 
| 4 | 
            +
            require 'active_crypto'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
             | 
| 7 | 
            +
            class User < ActiveRecord::Base
         | 
| 8 | 
            +
            	has_many :secrets
         | 
| 9 | 
            +
            	has_many :groups
         | 
| 10 | 
            +
            	keyholder
         | 
| 11 | 
            +
            end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            class Secret < ActiveRecord::Base
         | 
| 14 | 
            +
            	encrypt :name,:email, :key=>:user, :base64=>true
         | 
| 15 | 
            +
            	belongs_to :user
         | 
| 16 | 
            +
            	has_many :children
         | 
| 17 | 
            +
            end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            class Child < ActiveRecord::Base
         | 
| 20 | 
            +
            	encrypt :email, :key=>:secret, :base64=>true
         | 
| 21 | 
            +
            	belongs_to :secret
         | 
| 22 | 
            +
            end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            class Asset<ActiveRecord::Base
         | 
| 25 | 
            +
              encrypt :title, :base64=>true
         | 
| 26 | 
            +
              has_many :caps,:dependent=>:destroy
         | 
| 27 | 
            +
              
         | 
| 28 | 
            +
              def self.create(title,email)
         | 
| 29 | 
            +
                asset=Asset.new
         | 
| 30 | 
            +
                asset.set_session_key(EzCrypto::Key.generate)
         | 
| 31 | 
            +
                asset.title=title
         | 
| 32 | 
            +
                if asset.save
         | 
| 33 | 
            +
                  asset.share(email)
         | 
| 34 | 
            +
                else
         | 
| 35 | 
            +
                  nil
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              def share(email=nil)
         | 
| 40 | 
            +
                Cap.create_for_asset(self,email)
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
              
         | 
| 43 | 
            +
            end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            class AssetRaw<ActiveRecord::Base
         | 
| 46 | 
            +
              set_table_name "assets"
         | 
| 47 | 
            +
            end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            class Cap < ActiveRecord::Base
         | 
| 50 | 
            +
              belongs_to :asset
         | 
| 51 | 
            +
              encrypt :shared_key, :base64=>true
         | 
| 52 | 
            +
              
         | 
| 53 | 
            +
              def self.find_by_key(cap_key)
         | 
| 54 | 
            +
                cap_key.chop
         | 
| 55 | 
            +
                hash=Digest::SHA1.hexdigest(cap_key)
         | 
| 56 | 
            +
                if (cap_key.length>=20) # Sanity check
         | 
| 57 | 
            +
                  cap=self.find_by_key_hash(hash)
         | 
| 58 | 
            +
                  if cap
         | 
| 59 | 
            +
                    cap.set_encoded_key(cap_key)
         | 
| 60 | 
            +
                    cap.asset.set_encoded_key(cap.shared_key)
         | 
| 61 | 
            +
                    cap
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                else
         | 
| 64 | 
            +
                  nil
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
              
         | 
| 68 | 
            +
              def self.create_for_asset(asset,email=nil)
         | 
| 69 | 
            +
                cap=Cap.new
         | 
| 70 | 
            +
                cap.email=email if email
         | 
| 71 | 
            +
                cap.asset=asset
         | 
| 72 | 
            +
                if cap.save
         | 
| 73 | 
            +
                  cap.set_session_key(EzCrypto::Key.generate)
         | 
| 74 | 
            +
                  cap_key=cap.session_key.encode
         | 
| 75 | 
            +
                  cap.key_hash=Digest::SHA1.hexdigest(cap_key)
         | 
| 76 | 
            +
                  cap.shared_key=asset.session_key.encode
         | 
| 77 | 
            +
                  cap.save
         | 
| 78 | 
            +
                  cap_key
         | 
| 79 | 
            +
                else
         | 
| 80 | 
            +
                  nil
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
              end
         | 
| 83 | 
            +
              
         | 
| 84 | 
            +
            end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            class Group < ActiveRecord::Base
         | 
| 87 | 
            +
            	belongs_to :user
         | 
| 88 | 
            +
            	has_many :group_secrets
         | 
| 89 | 
            +
            	
         | 
| 90 | 
            +
            	encrypt :name,:group_key, :key=>:user	, :base64=>true
         | 
| 91 | 
            +
            end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            class GroupSecret < ActiveRecord::Base
         | 
| 94 | 
            +
            	belongs_to :group
         | 
| 95 | 
            +
            	
         | 
| 96 | 
            +
            	encrypt :title,:body, :key=>:group, :base64=>true
         | 
| 97 | 
            +
            	
         | 
| 98 | 
            +
            end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
            class ActiveCryptoTest < Test::Unit::TestCase
         | 
| 101 | 
            +
             
         | 
| 102 | 
            +
              def setup
         | 
| 103 | 
            +
              end
         | 
| 104 | 
            +
                
         | 
| 105 | 
            +
              def test_key_holder_in_record
         | 
| 106 | 
            +
                user=User.new
         | 
| 107 | 
            +
                user.name="bob"
         | 
| 108 | 
            +
                user.save
         | 
| 109 | 
            +
              	assert user.kind_of?(ActiveCrypto::KeyHolder)
         | 
| 110 | 
            +
              	assert user.kind_of?(ActiveRecord::Base)
         | 
| 111 | 
            +
              	assert user.kind_of?(User)
         | 
| 112 | 
            +
                assert_nil user.session_key
         | 
| 113 | 
            +
              	user.enter_password "shhcccc"
         | 
| 114 | 
            +
              	assert_not_nil user.session_key
         | 
| 115 | 
            +
              	assert_not_nil user.session_key.encrypt("test")    
         | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
              
         | 
| 118 | 
            +
              def test_encrypted_child
         | 
| 119 | 
            +
                user=User.new
         | 
| 120 | 
            +
                user.save
         | 
| 121 | 
            +
                assert_nil user.session_key
         | 
| 122 | 
            +
              	user.enter_password "shhcccc"
         | 
| 123 | 
            +
              	assert_not_nil user.session_key
         | 
| 124 | 
            +
              	assert user.kind_of?(ActiveCrypto::KeyHolder)
         | 
| 125 | 
            +
              	assert user.kind_of?(ActiveRecord::Base)
         | 
| 126 | 
            +
              	assert user.kind_of?(User)
         | 
| 127 | 
            +
              	
         | 
| 128 | 
            +
              	jill=user.secrets.create
         | 
| 129 | 
            +
              	
         | 
| 130 | 
            +
              	assert_not_nil jill
         | 
| 131 | 
            +
              	assert jill.kind_of?(ActiveCrypto::AssociationKeyHolder)
         | 
| 132 | 
            +
              	assert jill.kind_of?(ActiveCrypto::KeyHolder)
         | 
| 133 | 
            +
              	assert jill.kind_of?(ActiveCrypto::Encrypted)
         | 
| 134 | 
            +
              	assert jill.kind_of?(ActiveRecord::Base)
         | 
| 135 | 
            +
              	assert jill.kind_of?(Secret)
         | 
| 136 | 
            +
              	
         | 
| 137 | 
            +
              	assert jill.respond_to?(:session_key)
         | 
| 138 | 
            +
              	
         | 
| 139 | 
            +
                assert_not_nil jill.user
         | 
| 140 | 
            +
                assert_not_nil jill.user.session_key
         | 
| 141 | 
            +
              	
         | 
| 142 | 
            +
              	
         | 
| 143 | 
            +
                assert_not_nil jill.session_key
         | 
| 144 | 
            +
                assert_equal user.session_key,jill.session_key
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                jill.name="jill"
         | 
| 147 | 
            +
                jill.save
         | 
| 148 | 
            +
             | 
| 149 | 
            +
             | 
| 150 | 
            +
                assert_equal "jill",jill.name
         | 
| 151 | 
            +
                
         | 
| 152 | 
            +
                jill=user.secrets.first
         | 
| 153 | 
            +
                assert_not_nil jill.session_key
         | 
| 154 | 
            +
                assert_equal user.session_key,jill.session_key
         | 
| 155 | 
            +
                assert_equal "jill",jill.name
         | 
| 156 | 
            +
                
         | 
| 157 | 
            +
                child=jill.children.create
         | 
| 158 | 
            +
                child.email="pelle@neubia.com"
         | 
| 159 | 
            +
                child.save
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                assert_not_nil child.secret
         | 
| 162 | 
            +
                assert_not_nil child.secret.session_key
         | 
| 163 | 
            +
             | 
| 164 | 
            +
             | 
| 165 | 
            +
                assert_not_nil child.session_key
         | 
| 166 | 
            +
                assert_equal user.session_key,child.session_key
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                assert_equal "pelle@neubia.com",child.email
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                child=jill.children.first
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                assert_not_nil child.secret
         | 
| 173 | 
            +
                assert_not_nil child.secret.session_key
         | 
| 174 | 
            +
             | 
| 175 | 
            +
             | 
| 176 | 
            +
                assert_not_nil child.session_key
         | 
| 177 | 
            +
                assert_equal user.session_key,child.session_key
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                assert_equal "pelle@neubia.com",child.email
         | 
| 180 | 
            +
             | 
| 181 | 
            +
              end
         | 
| 182 | 
            +
             | 
| 183 | 
            +
              def test_caps
         | 
| 184 | 
            +
                key=Asset.create("title","pelle@neubia.com")
         | 
| 185 | 
            +
                assert_not_nil key
         | 
| 186 | 
            +
                cap=Cap.find_by_key key
         | 
| 187 | 
            +
                assert_not_nil cap
         | 
| 188 | 
            +
                assert_not_nil cap.asset
         | 
| 189 | 
            +
                
         | 
| 190 | 
            +
                assert_equal "title",cap.asset.title
         | 
| 191 | 
            +
                assert_equal "title",cap.asset["title"]
         | 
| 192 | 
            +
                assert_equal "pelle@neubia.com",cap.email
         | 
| 193 | 
            +
                assert_equal "pelle@neubia.com",cap["email"]
         | 
| 194 | 
            +
                
         | 
| 195 | 
            +
                # Non decrypting version
         | 
| 196 | 
            +
                raw=AssetRaw.find cap.asset.id
         | 
| 197 | 
            +
                assert_not_equal "title",raw.title
         | 
| 198 | 
            +
                assert_not_equal "title",raw["title"]
         | 
| 199 | 
            +
                
         | 
| 200 | 
            +
                bob_key=cap.asset.share("bob@bob.com")
         | 
| 201 | 
            +
                bob_cap=Cap.find_by_key bob_key
         | 
| 202 | 
            +
                
         | 
| 203 | 
            +
                assert_not_equal key,bob_key
         | 
| 204 | 
            +
                assert_not_nil bob_cap
         | 
| 205 | 
            +
                assert_not_nil bob_cap.asset
         | 
| 206 | 
            +
                assert_equal "title",bob_cap.asset.title
         | 
| 207 | 
            +
                assert_equal "bob@bob.com",bob_cap.email
         | 
| 208 | 
            +
              end
         | 
| 209 | 
            +
            end
         | 
| 210 | 
            +
             | 
| 211 | 
            +
             | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            -----BEGIN CERTIFICATE-----
         | 
| 2 | 
            +
            MIIFIzCCBAugAwIBAgIEdjTPCDANBgkqhkiG9w0BAQUFADCB3DELMAkGA1UEBhMC
         | 
| 3 | 
            +
            VVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNV
         | 
| 4 | 
            +
            BAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOTA3BgNVBAsTMGh0dHA6
         | 
| 5 | 
            +
            Ly9jZXJ0aWZpY2F0ZXMuc3RhcmZpZWxkdGVjaC5jb20vcmVwb3NpdG9yeTExMC8G
         | 
| 6 | 
            +
            A1UEAxMoU3RhcmZpZWxkIFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTER
         | 
| 7 | 
            +
            MA8GA1UEBRMIMTA2ODg0MzUwHhcNMDkwMzEwMTUyMzQ1WhcNMTAwMzExMjAzNzE0
         | 
| 8 | 
            +
            WjB6MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
         | 
| 9 | 
            +
            U2FuIEZyYW5jaXNjbzEYMBYGA1UEChMPRXh0cmEgRWFnbGUgTExDMQ8wDQYDVQQL
         | 
| 10 | 
            +
            EwZBZ3JlZTIxEzARBgNVBAMTCmFncmVlMi5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
         | 
| 11 | 
            +
            gY0AMIGJAoGBAPNfoI6m+NIm69qkuOgOwlRI64W6SmJ+xlxz/fduK/0XtqRlANL9
         | 
| 12 | 
            +
            aENxkAEvJz6tpsinNOAry96ucajZP9WUMWfy+wmXkTWLQN1jVPZUJs2mBBw6ajgm
         | 
| 13 | 
            +
            8xLgPWn3czRve0Q34poWGLFb+CZdcZScbnHcn6Dkt8SwMsFFBhLB0FM/AgMBAAGj
         | 
| 14 | 
            +
            ggHQMIIBzDAPBgNVHRMBAf8EBTADAQEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
         | 
| 15 | 
            +
            BgEFBQcDAjAOBgNVHQ8BAf8EBAMCBaAwOAYDVR0fBDEwLzAtoCugKYYnaHR0cDov
         | 
| 16 | 
            +
            L2NybC5zdGFyZmllbGR0ZWNoLmNvbS9zZnMyLTAuY3JsMFkGA1UdIARSMFAwTgYL
         | 
| 17 | 
            +
            YIZIAYb9bgEHFwIwPzA9BggrBgEFBQcCARYxaHR0cDovL2NlcnRpZmljYXRlcy5z
         | 
| 18 | 
            +
            dGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5LzCBjQYIKwYBBQUHAQEEgYAwfjAq
         | 
| 19 | 
            +
            BggrBgEFBQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxkdGVjaC5jb20vMFAGCCsG
         | 
| 20 | 
            +
            AQUFBzAChkRodHRwOi8vY2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3Jl
         | 
| 21 | 
            +
            cG9zaXRvcnkvc2ZfaW50ZXJtZWRpYXRlLmNydDAfBgNVHSMEGDAWgBRJS1In0Ru8
         | 
| 22 | 
            +
            8qEhamJ7UUJ6itfVVjAlBgNVHREEHjAcggphZ3JlZTIuY29tgg53d3cuYWdyZWUy
         | 
| 23 | 
            +
            LmNvbTAdBgNVHQ4EFgQU8U68CbJHeGRhPSl2LRtx9IaocA4wDQYJKoZIhvcNAQEF
         | 
| 24 | 
            +
            BQADggEBACFngInbvv6YmtiwHFWZswcY7eoqMpUggXC2jmX9ZT+w9CcdgVlygow6
         | 
| 25 | 
            +
            jeR2HY7FPSKkm0YaDEAYYIoYeFHwaG6E4B6ykGvw5OQ4FESsQT/lxVlbeF0J1ERh
         | 
| 26 | 
            +
            YEpvwrVrVK/ppRd5En2hvl6kKvRyqjTcHKT/MKZ2xQXUZ6JEVKIME3HLS+IHR/Sc
         | 
| 27 | 
            +
            uo1aH3dXS73lFmWLH4P12KIfqnzQ938FDynW875bvKgl4HAzJj66wnMOoL5INOuK
         | 
| 28 | 
            +
            d+r9xUBD/uWXJPaXLzC8vuORHInLWNE4M2cpNeVNsU8siX4c9mC/Hj+Ss1nYBW0D
         | 
| 29 | 
            +
            4b8GcJ+tY+2Y+ODBKJn/s0qhB6TXoKM=
         | 
| 30 | 
            +
            -----END CERTIFICATE-----
         | 
| 31 | 
            +
             | 
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            require 'key_holder_test'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class User < ActiveRecord::Base
         | 
| 4 | 
            +
              keyholder
         | 
| 5 | 
            +
            end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            class AssociationKeyHolderTest < KeyHolderTest
         | 
| 8 | 
            +
              def setup
         | 
| 9 | 
            +
                @key_holder=User.create
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
              
         | 
| 12 | 
            +
              def test_should_retain_session_key_on_reload
         | 
| 13 | 
            +
                key=EzCrypto::Key.generate
         | 
| 14 | 
            +
                key_holder.set_session_key key
         | 
| 15 | 
            +
                assert_not_nil key_holder.session_key
         | 
| 16 | 
            +
                assert_equal key.raw,key_holder.session_key.raw
         | 
| 17 | 
            +
                
         | 
| 18 | 
            +
                reloaded=User.find key_holder.id
         | 
| 19 | 
            +
                assert_not_nil reloaded.session_key
         | 
| 20 | 
            +
                assert_equal key.raw,reloaded.session_key.raw    
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
              
         | 
| 23 | 
            +
              def test_should_retain_session_key_on_reload_for_record_with_key_set_before_create
         | 
| 24 | 
            +
                key=EzCrypto::Key.generate
         | 
| 25 | 
            +
                key_holder=User.new
         | 
| 26 | 
            +
                assert_nil key_holder.session_key
         | 
| 27 | 
            +
                
         | 
| 28 | 
            +
                key_holder.set_session_key key
         | 
| 29 | 
            +
                assert_not_nil key_holder.session_key
         | 
| 30 | 
            +
                
         | 
| 31 | 
            +
                assert_equal key.raw,key_holder.session_key.raw
         | 
| 32 | 
            +
                key_holder.save
         | 
| 33 | 
            +
                
         | 
| 34 | 
            +
                reloaded=User.find key_holder.id
         | 
| 35 | 
            +
                assert_not_nil reloaded.session_key
         | 
| 36 | 
            +
                assert_equal key.raw,reloaded.session_key.raw    
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         |