vidibus-secure 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.bundle/config ADDED
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_DISABLE_SHARED_GEMS: "1"
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+ .document
21
+
22
+ ## PROJECT::SPECIFIC
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format nested
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "mongoid", "~> 2.0.0.beta.20"
4
+ gem "activesupport", "~> 3.0.0"
5
+ gem "rack"
6
+ gem "vidibus-core_extensions"
7
+
8
+ # Development dependencies
9
+ gem "rails", "~> 3.0.0"
10
+ gem "rspec", "~> 2.0.0.beta.20"
11
+ gem "rr"
12
+ gem "relevance-rcov"
data/Gemfile.lock ADDED
@@ -0,0 +1,100 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ abstract (1.0.0)
5
+ actionmailer (3.0.0)
6
+ actionpack (= 3.0.0)
7
+ mail (~> 2.2.5)
8
+ actionpack (3.0.0)
9
+ activemodel (= 3.0.0)
10
+ activesupport (= 3.0.0)
11
+ builder (~> 2.1.2)
12
+ erubis (~> 2.6.6)
13
+ i18n (~> 0.4.1)
14
+ rack (~> 1.2.1)
15
+ rack-mount (~> 0.6.12)
16
+ rack-test (~> 0.5.4)
17
+ tzinfo (~> 0.3.23)
18
+ activemodel (3.0.0)
19
+ activesupport (= 3.0.0)
20
+ builder (~> 2.1.2)
21
+ i18n (~> 0.4.1)
22
+ activerecord (3.0.0)
23
+ activemodel (= 3.0.0)
24
+ activesupport (= 3.0.0)
25
+ arel (~> 1.0.0)
26
+ tzinfo (~> 0.3.23)
27
+ activeresource (3.0.0)
28
+ activemodel (= 3.0.0)
29
+ activesupport (= 3.0.0)
30
+ activesupport (3.0.0)
31
+ arel (1.0.1)
32
+ activesupport (~> 3.0.0)
33
+ bson (1.0.4)
34
+ builder (2.1.2)
35
+ diff-lcs (1.1.2)
36
+ erubis (2.6.6)
37
+ abstract (>= 1.0.0)
38
+ i18n (0.4.1)
39
+ mail (2.2.5)
40
+ activesupport (>= 2.3.6)
41
+ mime-types
42
+ treetop (>= 1.4.5)
43
+ mime-types (1.16)
44
+ mongo (1.0.7)
45
+ bson (>= 1.0.4)
46
+ mongoid (2.0.0.beta.17)
47
+ activemodel (~> 3.0.0)
48
+ bson (= 1.0.4)
49
+ mongo (= 1.0.7)
50
+ tzinfo (~> 0.3.22)
51
+ will_paginate (~> 3.0.pre)
52
+ polyglot (0.3.1)
53
+ rack (1.2.1)
54
+ rack-mount (0.6.13)
55
+ rack (>= 1.0.0)
56
+ rack-test (0.5.4)
57
+ rack (>= 1.0)
58
+ rails (3.0.0)
59
+ actionmailer (= 3.0.0)
60
+ actionpack (= 3.0.0)
61
+ activerecord (= 3.0.0)
62
+ activeresource (= 3.0.0)
63
+ activesupport (= 3.0.0)
64
+ bundler (~> 1.0.0)
65
+ railties (= 3.0.0)
66
+ railties (3.0.0)
67
+ actionpack (= 3.0.0)
68
+ activesupport (= 3.0.0)
69
+ rake (>= 0.8.4)
70
+ thor (~> 0.14.0)
71
+ rake (0.8.7)
72
+ relevance-rcov (0.9.2.1)
73
+ rr (1.0.0)
74
+ rspec (2.0.0.beta.20)
75
+ rspec-core (= 2.0.0.beta.20)
76
+ rspec-expectations (= 2.0.0.beta.20)
77
+ rspec-mocks (= 2.0.0.beta.20)
78
+ rspec-core (2.0.0.beta.20)
79
+ rspec-expectations (2.0.0.beta.20)
80
+ diff-lcs (>= 1.1.2)
81
+ rspec-mocks (2.0.0.beta.20)
82
+ thor (0.14.0)
83
+ treetop (1.4.8)
84
+ polyglot (>= 0.3.1)
85
+ tzinfo (0.3.23)
86
+ vidibus-core_extensions (0.3.5)
87
+ will_paginate (3.0.pre2)
88
+
89
+ PLATFORMS
90
+ ruby
91
+
92
+ DEPENDENCIES
93
+ activesupport (~> 3.0.0)
94
+ mongoid (~> 2.0.0.beta.20)
95
+ rack
96
+ rails (~> 3.0.0)
97
+ relevance-rcov
98
+ rr
99
+ rspec (~> 2.0.0.beta.20)
100
+ vidibus-core_extensions
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Andre Pankratz
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,38 @@
1
+ = vidibus-secure
2
+
3
+ This gem is part of the open source SOA framework Vidibus: http://www.vidibus.org
4
+
5
+ TODO: Describe
6
+
7
+
8
+ == Installation
9
+
10
+ Add the dependency to the Gemfile of your application:
11
+
12
+ gem "vidibus-secure"
13
+
14
+ Then call `bundle install` on your console.
15
+
16
+ If you want to use Vidibus::Secure::Mongoid in your models, you should generate an initializer to set an unique encryption key:
17
+
18
+ rails generate vidibus_secure_key
19
+
20
+
21
+ == Usage
22
+
23
+ TODO: Describe
24
+
25
+
26
+ === Usage in Mongoid model
27
+
28
+ TODO: Describe
29
+
30
+
31
+ == TODO
32
+
33
+ * Documentation
34
+
35
+
36
+ == Copyright
37
+
38
+ Copyright (c) 2010 Andre Pankratz. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,39 @@
1
+ require "rubygems"
2
+ require "rake"
3
+ require "rake/rdoctask"
4
+ require "rspec"
5
+ require "rspec/core/rake_task"
6
+
7
+ begin
8
+ require "jeweler"
9
+ Jeweler::Tasks.new do |gem|
10
+ gem.name = "vidibus-secure"
11
+ gem.summary = %Q{Security tools for Vidibus applications}
12
+ gem.description = %Q{Description...}
13
+ gem.email = "andre@vidibus.com"
14
+ gem.homepage = "http://github.com/vidibus/vidibus-secure"
15
+ gem.authors = ["Andre Pankratz"]
16
+ gem.add_dependency "mongoid", "~> 2.0.0.beta.20"
17
+ gem.add_dependency "activesupport", "~> 3.0.0"
18
+ gem.add_dependency "rack"
19
+ gem.add_dependency "vidibus-core_extensions"
20
+ end
21
+ Jeweler::GemcutterTasks.new
22
+ rescue LoadError
23
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
24
+ end
25
+
26
+ Rspec::Core::RakeTask.new(:rcov) do |t|
27
+ t.pattern = "spec/**/*_spec.rb"
28
+ t.rcov = true
29
+ t.rcov_opts = ["--exclude", "^spec,/gems/"]
30
+ end
31
+
32
+ Rake::RDocTask.new do |rdoc|
33
+ version = File.exist?("VERSION") ? File.read("VERSION") : ""
34
+ rdoc.rdoc_dir = "rdoc"
35
+ rdoc.title = "vidibus-secure #{version}"
36
+ rdoc.rdoc_files.include("README*")
37
+ rdoc.rdoc_files.include("lib/**/*.rb")
38
+ rdoc.options << "--charset=utf-8"
39
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,11 @@
1
+ class VidibusSecureKeyGenerator < Rails::Generators::Base
2
+ desc 'Generates an initializer that sets ENV["VIDIBUS_SECURE_KEY"]'
3
+
4
+ def create_initializer
5
+ create_file "config/initializers/vidibus_secure_key.rb" do
6
+ %(# This is a secret key for encrypting values of field defined by attr_encrypted.\n) +
7
+ %(# Do not change this encryption key! Otherwise you will not be able to decrypt data already stored in your database.\n) +
8
+ %(ENV["VIDIBUS_SECURE_KEY"] = "#{Vidibus::Secure.random(:encoding => :base64, :length => 100)}")
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,34 @@
1
+ module Vidibus
2
+ module Secure
3
+ module Extensions
4
+
5
+ # Contains extensions of ApplicationController.
6
+ module Controller
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ helper_method :valid_request?
11
+ end
12
+
13
+ # Generates a signature of a request path.
14
+ # Will use the current request.fullpath unless an URI is given.
15
+ #
16
+ # The given URI will be decomposed into path and request params.
17
+ # A given +signature_param+ will be removed, all remaining params
18
+ # will be ordered alphabetically.
19
+ #
20
+ # Usage:
21
+ #
22
+ # valid_request?("mysecret")
23
+ # valid_request?("mysecret", :uri => "http://...", :method => "get", :params => {})
24
+ #
25
+ def valid_request?(secret, options = {})
26
+ method = options.delete(:method) || request.method
27
+ uri = options.delete(:uri) || request.protocol + request.host_with_port + request.fullpath
28
+ params = options.delete(:params) || request.params.except(:action, "action", :controller, "controller", :id, "id")
29
+ Vidibus::Secure.verify_request(method, uri, params, secret)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,5 @@
1
+ require "secure/extensions/controller"
2
+
3
+ ActiveSupport.on_load(:action_controller) do
4
+ include Vidibus::Secure::Extensions::Controller
5
+ end
@@ -0,0 +1,35 @@
1
+ module Vidibus
2
+ module Secure
3
+ module Mongoid
4
+ extend ActiveSupport::Concern
5
+ module ClassMethods
6
+
7
+ # Sets encrypted attributes.
8
+ def attr_encrypted(*args)
9
+ key = ENV["VIDIBUS_SECURE_KEY"]
10
+ options = args.extract_options!
11
+ for field in args
12
+
13
+ # Define Mongoid field
14
+ encrypted_field = "#{field}_encrypted"
15
+ self.send(:field, encrypted_field, :type => Binary)
16
+
17
+ # Define setter
18
+ class_eval <<-EOV
19
+ def #{field}=(value)
20
+ self.#{encrypted_field} = value ? Vidibus::Secure.encrypt(value, "#{key}") : nil
21
+ end
22
+ EOV
23
+
24
+ # Define getter
25
+ class_eval <<-EOV
26
+ def #{field}
27
+ Vidibus::Secure.decrypt(#{encrypted_field}, "#{key}") if #{encrypted_field}
28
+ end
29
+ EOV
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,131 @@
1
+ require "openssl"
2
+ require "active_support/secure_random"
3
+ require "rack"
4
+ require "uri"
5
+
6
+ module Vidibus
7
+ module Secure
8
+
9
+ class KeyError < StandardError; end
10
+
11
+ class << self
12
+
13
+ # Define default settings for random, sign, and crypt.
14
+ def settings
15
+ @settings ||= {
16
+ :random => { :length => 50, :encoding => :base64 },
17
+ :sign => { :algorithm => "SHA256", :encoding => :hex },
18
+ :crypt => { :algorithm => "AES-256-CBC", :encoding => :base64 }
19
+ }
20
+ end
21
+
22
+ # Returns a truly random string.
23
+ # Now it is not much more than an interface for ActiveSupport::SecureRandom,
24
+ # but that might change over time.
25
+ #
26
+ # Options:
27
+ # :length Length of string to generate
28
+ # :encoding Encoding of string; hex or base64
29
+ #
30
+ # Keep in mind that a hexadecimal string is less secure
31
+ # than a base64 encoded string with the same length!
32
+ #
33
+ def random(options = {})
34
+ options = settings[:random].merge(options)
35
+ length = options[:length]
36
+ ActiveSupport::SecureRandom.send(options[:encoding], length)[0,length]
37
+ end
38
+
39
+ # Returns signature of given data with given key.
40
+ def sign(data, key, options = {})
41
+ raise KeyError.new("Please provide a secret key to sign data with.") unless key
42
+ options = settings[:sign].merge(options)
43
+ digest = OpenSSL::Digest::Digest.new(options[:algorithm])
44
+ signature = OpenSSL::HMAC.digest(digest, key, data)
45
+ encode(signature, options)
46
+ end
47
+
48
+ # Encrypts given data with given key.
49
+ def encrypt(data, key, options = {})
50
+ raise KeyError.new("Please provide a secret key to encrypt data with.") unless key
51
+ options = settings[:crypt].merge(options)
52
+ encrypted_data = crypt(:encrypt, data, key, options)
53
+ encode(encrypted_data, options)
54
+ end
55
+
56
+ # Decrypts given data with given key.
57
+ def decrypt(data, key, options = {})
58
+ raise KeyError.new("Please provide a secret key to decrypt data with.") unless key
59
+ options = settings[:crypt].merge(options)
60
+ decoded_data = decode(data, options)
61
+ crypt(:decrypt, decoded_data, key, options)
62
+ end
63
+
64
+ # Signs request.
65
+ def sign_request(verb, path, params, key, signature_param = nil)
66
+ default_signature_param = :sign
67
+ params_given = !!params
68
+ raise ArgumentError.new("Given params is not a Hash.") if params_given and !params.is_a?(Hash)
69
+ params = {} unless params_given
70
+ signature_param ||= (params_given and params.keys.first.is_a?(String)) ? default_signature_param.to_s : default_signature_param
71
+
72
+ uri = URI.parse(path)
73
+ path_params = Rack::Utils.parse_query(uri.query)
74
+ uri.query = nil
75
+
76
+ _verb = verb.to_s.downcase
77
+ _uri = uri.to_s.gsub(/\/+$/, "")
78
+ _params = (params.merge(path_params)).except(signature_param.to_s, signature_param.to_s.to_sym)
79
+ _params = _params.any? ? _params.to_a_rec.flatten.sort{|a,b| a.to_s <=> b.to_s}.join("|") : ""
80
+
81
+ signature = sign("#{_verb}|#{_uri}|#{_params}", key)
82
+
83
+ if %w[post put].include?(_verb) or (params_given and path_params.empty?)
84
+ params[signature_param] = signature
85
+ else
86
+ unless path.gsub!(/(#{signature_param}=)[^&]+/, "\\1#{signature}")
87
+ glue = path.match(/\?/) ? "&" : "?"
88
+ path << "#{glue}#{signature_param}=#{signature}"
89
+ end
90
+ end
91
+ [path, params]
92
+ end
93
+
94
+ # Verifies that given request is valid.
95
+ def verify_request(verb, path, params, key, signature_param = nil)
96
+ params ||= {}
97
+ _path = path.dup
98
+ _params = params.dup
99
+ sign_request(verb, _path, _params, key, signature_param)
100
+ return (path == _path and params == _params)
101
+ end
102
+
103
+ protected
104
+
105
+ def crypt(cipher_method, data, key, options = {})
106
+ cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm])
107
+ digest = OpenSSL::Digest::SHA512.new(key).digest
108
+ cipher.send(cipher_method)
109
+ cipher.pkcs5_keyivgen(digest)
110
+ result = cipher.update(data)
111
+ result << cipher.final
112
+ end
113
+
114
+ def encode(data, options = {})
115
+ if options[:encoding] == :hex
116
+ data.unpack("H*").to_s
117
+ elsif options[:encoding] == :base64
118
+ [data].pack("m*")
119
+ end
120
+ end
121
+
122
+ def decode(data, options = {})
123
+ if options[:encoding] == :hex
124
+ [data].pack("H*")
125
+ elsif options[:encoding] == :base64
126
+ data.unpack("m*").to_s
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,6 @@
1
+ require "vidibus-core_extensions"
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib", "vidibus"))
4
+ require "secure"
5
+ require "secure/mongoid"
6
+ require "secure/extensions"
@@ -0,0 +1,21 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+
4
+ require "rubygems"
5
+ require "mongoid"
6
+ require "rspec"
7
+ require "rr"
8
+ require "vidibus-secure"
9
+
10
+ Mongoid.configure do |config|
11
+ name = "vidibus-secure_test"
12
+ host = "localhost"
13
+ config.master = Mongo::Connection.new.db(name)
14
+ end
15
+
16
+ RSpec.configure do |config|
17
+ config.mock_with :rr
18
+ config.after :suite do
19
+ Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop)
20
+ end
21
+ end
@@ -0,0 +1,75 @@
1
+ require "ostruct"
2
+ require "spec_helper"
3
+ require "action_controller"
4
+
5
+ class Controller < ActionController::Base; end
6
+
7
+ describe "Vidibus::Secure::Extensions::Controller" do
8
+ let(:controller) { Controller.new }
9
+ let(:secret) { "mysecret" }
10
+
11
+ before do
12
+ stub(controller).request do
13
+ @request ||= begin
14
+ Struct.new("Request", :protocol, :host_with_port, :fullpath, :method, :params) unless defined?(Struct::Request)
15
+ Struct::Request.new("http://", "vidibus.org", "/", "get", {})
16
+ end
17
+ end
18
+ end
19
+
20
+ describe "#valid_request?" do
21
+ it "should available to controllers that stem from ActionController::Base" do
22
+ controller.should respond_to(:valid_request?)
23
+ end
24
+
25
+ it "should build URI from request object if no :uri is provided" do
26
+ mock(controller.request).protocol {"http://"}
27
+ mock(controller.request).host_with_port {"vidibus.org"}
28
+ mock(controller.request).fullpath {"/"}
29
+ controller.valid_request?(secret, :method => "get", :params => {})
30
+ end
31
+
32
+ it "should use request.method if no :method is provided" do
33
+ mock(controller.request).method {"get"}
34
+ controller.valid_request?(secret, :uri => "something", :params => {})
35
+ end
36
+
37
+ it "should use request.params if no :params are provided" do
38
+ mock(controller.request).params {{}}
39
+ controller.valid_request?(secret, :uri => "something", :method => "get")
40
+ end
41
+
42
+ it "should use given params" do
43
+ dont_allow(controller).request
44
+ controller.valid_request?(secret, :method => "get", :uri => "something", :params => {})
45
+ end
46
+
47
+ it "should return true for valid requests" do
48
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/", controller.request.params, secret)
49
+ controller.valid_request?(secret).should be_true
50
+ end
51
+
52
+ it "should omit :action, :controller, and :id from request.params" do
53
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/", controller.request.params, secret)
54
+ controller.request.params.merge(:action => "index", :controller => "application", :id => nil)
55
+ controller.valid_request?(secret).should be_true
56
+ end
57
+
58
+ it "should omit 'action', 'controller', and 'id' from request.params" do
59
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/", controller.request.params, secret)
60
+ controller.request.params.merge("action" => "index", "controller" => "application", "id" => nil)
61
+ controller.valid_request?(secret).should be_true
62
+ end
63
+
64
+ it "should keep :action, :controller, and :id in custom params" do
65
+ params = { :action => "index", :controller => "application", :id => "12" }
66
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/", params, secret)
67
+ controller.valid_request?(secret, :params => params).should be_true
68
+ end
69
+
70
+ it "should call Vidibus::Secure.verify_request" do
71
+ mock(Vidibus::Secure).verify_request("get", "http://vidibus.org/", {}, secret)
72
+ controller.valid_request?(secret)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,89 @@
1
+ require "spec_helper"
2
+
3
+ ENV["VIDIBUS_SECURE_KEY"] = "c4l60HC/lyerr2VEnrP7s2YAldyZGfIBePUzCl+tBsTs1EWJOc8dEJ7F2Vty7KPEeRuBWGxZHVAbku8pLo+UvXRpLcRiF7lxKiKl"
4
+
5
+ class Model
6
+ include Mongoid::Document
7
+ include Vidibus::Secure::Mongoid
8
+ attr_encrypted :my_secret, :another_secret
9
+ end
10
+
11
+ describe "Vidibus::Secure::Mongoid" do
12
+ let(:model) { Model.new }
13
+ let(:secret) { "My name is Bond." }
14
+ let(:encrypted_secret) { "+PlBG1ChiqUAYMrHlJzDL4NwXHtGBIUm/KQ2ZWfwxjM=\n" }
15
+
16
+ it "should add a field :my_secret_encrypted" do
17
+ model.should respond_to(:my_secret_encrypted)
18
+ end
19
+
20
+ it "should add a setter for :my_secret" do
21
+ model.should respond_to(:my_secret=)
22
+ end
23
+
24
+ it "should add a getter for :my_secret" do
25
+ model.should respond_to(:my_secret)
26
+ end
27
+
28
+ it "should add a field :another_secret_encrypted" do
29
+ model.should respond_to(:another_secret_encrypted)
30
+ end
31
+
32
+ it "should add a setter for :another_secret" do
33
+ model.should respond_to(:another_secret=)
34
+ end
35
+
36
+ it "should add a getter for :another_secret" do
37
+ model.should respond_to(:another_secret)
38
+ end
39
+
40
+ describe "#my_secret=" do
41
+ it "should set :my_secret_encrypted" do
42
+ model.my_secret_encrypted.should be_nil
43
+ model.my_secret = "my_secret"
44
+ model.my_secret_encrypted.should_not be_nil
45
+ end
46
+
47
+ it "should encrypt a given value" do
48
+ model.my_secret = secret
49
+ model.my_secret_encrypted.should eql(encrypted_secret)
50
+ end
51
+
52
+ it "should be persistent" do
53
+ model.my_secret = secret
54
+ model.save!
55
+ model.reload
56
+ model.my_secret_encrypted.should eql(encrypted_secret)
57
+ end
58
+
59
+ it "should not encrypt nil" do
60
+ model.my_secret = nil
61
+ model.my_secret_encrypted.should eql(nil)
62
+ end
63
+ end
64
+
65
+ describe "#my_secret" do
66
+ it "should get :my_secret_encrypted" do
67
+ model.my_secret.should be_nil
68
+ model.my_secret_encrypted = encrypted_secret
69
+ model.my_secret.should_not be_nil
70
+ end
71
+
72
+ it "should decrypt value of :my_secret_encrypted" do
73
+ model.my_secret_encrypted = encrypted_secret
74
+ model.my_secret.should eql(secret)
75
+ end
76
+
77
+ it "should be persistent" do
78
+ model.my_secret_encrypted = encrypted_secret
79
+ model.save!
80
+ model.reload
81
+ model.my_secret.should eql(secret)
82
+ end
83
+
84
+ it "should not decrypt nil" do
85
+ model.my_secret_encrypted = nil
86
+ model.my_secret.should eql(nil)
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,345 @@
1
+ require "spec_helper"
2
+
3
+ describe "Vidibus::Secure" do
4
+ let(:key) { "8KTbTanrBTQ5c8CjANpJQjPWcIstFxq/uFIUQBF3gRnztM565xIfe8MStVcLilbEhjYwfZiD4lFWINF22Aw8gVEbkSf2rLN0fnuO9YtNqFLQU6m/OldO5JbsBJPCwuzsPYmZ1w==" }
5
+ let(:data) { "My name is Bond. You know the rest." }
6
+ let(:encrypted_base64) { "hXUWa3gHRpYr/Fi2qm9xdTyZg7NSpYq8X2p1EL+/wffUg9IeIjVbSvyUYAvy\nTLbc\n" }
7
+ let(:encrypted_hex) { "8575166b780746962bfc58b6aa6f71753c9983b352a58abc5f6a7510bfbfc1f7d483d21e22355b4afc94600bf24cb6dc" }
8
+ let(:signature_base64) { "AhTlmymUI9q2bdrtJ0vLdyV8Y8eUf2U5xrzoK5PdWKQ=\n" }
9
+ let(:signature_hex) { "0214e59b299423dab66ddaed274bcb77257c63c7947f6539c6bce82b93dd58a4" }
10
+ let(:base64_format) { /([A-Z]|\+|\/)/ }
11
+ let(:hex_format) { /^[0-9a-f]+$/ }
12
+
13
+ describe ".settings" do
14
+ context "for :random" do
15
+ it "should default to a length of 50" do
16
+ Vidibus::Secure.settings[:random][:length].should eql(50)
17
+ end
18
+
19
+ it "should default to base64 encoding" do
20
+ Vidibus::Secure.settings[:random][:encoding].should eql(:base64)
21
+ end
22
+ end
23
+
24
+ context "for :sign" do
25
+ it "should default to SHA256 algorithm" do
26
+ Vidibus::Secure.settings[:sign][:algorithm].should eql("SHA256")
27
+ end
28
+
29
+ it "should default to hex encoding" do
30
+ Vidibus::Secure.settings[:sign][:encoding].should eql(:hex)
31
+ end
32
+ end
33
+
34
+ context "for :crypt" do
35
+ it "should default to AES-256-CBC algorithm" do
36
+ Vidibus::Secure.settings[:crypt][:algorithm].should eql("AES-256-CBC")
37
+ end
38
+
39
+ it "should default to base64 encoding" do
40
+ Vidibus::Secure.settings[:crypt][:encoding].should eql(:base64)
41
+ end
42
+ end
43
+ end
44
+
45
+ describe ".random" do
46
+ it "should create a base64 random string with a length of 50 chars" do
47
+ random = Vidibus::Secure.random
48
+ random.length.should eql(50)
49
+ random.should match(base64_format)
50
+ end
51
+
52
+ it "should create a hexadecimal random string with a length of 50 chars if :encoding is provided" do
53
+ random = Vidibus::Secure.random(:encoding => :hex)
54
+ random.length.should eql(50)
55
+ random.should match(hex_format)
56
+ end
57
+
58
+ it "should create a random string with a length of 60 chars if :length is provided" do
59
+ Vidibus::Secure.random(:length => 60).length.should eql(60)
60
+ end
61
+
62
+ it "should create a hexadecimal random string if settings for :random are changed" do
63
+ Vidibus::Secure.settings[:random][:encoding] = :hex
64
+ Vidibus::Secure.random.should match(hex_format)
65
+ Vidibus::Secure.settings[:random][:encoding] = :base64
66
+ end
67
+ end
68
+
69
+ describe ".sign" do
70
+ it "should create a hexadecimal signature of given data by default" do
71
+ Vidibus::Secure.sign(data, key).should eql(signature_hex)
72
+ end
73
+
74
+ it "should create a base64 signature of given data if :encoding is provided" do
75
+ Vidibus::Secure.sign(data, key, :encoding => :base64).should eql(signature_base64)
76
+ end
77
+
78
+ it "should create a base64 signature of given data if settings for :sign are changed" do
79
+ Vidibus::Secure.settings[:sign][:encoding] = :base64
80
+ Vidibus::Secure.sign(data, key).should eql(signature_base64)
81
+ Vidibus::Secure.settings[:sign][:encoding] = :hex
82
+ end
83
+
84
+ it "should raise an error if given secret key is nil" do
85
+ expect { Vidibus::Secure.sign(data, nil) }.to raise_error(Vidibus::Secure::KeyError)
86
+ end
87
+ end
88
+
89
+ describe ".encrypt" do
90
+ it "should encrypt data as base64 string" do
91
+ Vidibus::Secure.encrypt(data, key).should eql(encrypted_base64)
92
+ end
93
+
94
+ it "should encrypt data as hexadecimal string if :encoding is provided" do
95
+ Vidibus::Secure.encrypt(data, key, :encoding => :hex).should eql(encrypted_hex)
96
+ end
97
+
98
+ it "should encrypt data as hexadecimal string if encoding settings for :crypt are set to hex" do
99
+ Vidibus::Secure.settings[:crypt][:encoding] = :hex
100
+ Vidibus::Secure.encrypt(data, key).should eql(encrypted_hex)
101
+ Vidibus::Secure.settings[:crypt][:encoding] = :base64
102
+ end
103
+
104
+ it "should raise an error if given secret key is nil" do
105
+ expect { Vidibus::Secure.sign(data, nil) }.to raise_error(Vidibus::Secure::KeyError)
106
+ end
107
+ end
108
+
109
+ describe ".decrypt" do
110
+ it "should decrypt a base64 string" do
111
+ Vidibus::Secure.decrypt(encrypted_base64, key).should eql(data)
112
+ end
113
+
114
+ it "should decrypt a hexadecimal string if :encoding is provided" do
115
+ Vidibus::Secure.decrypt(encrypted_hex, key, :encoding => :hex).should eql(data)
116
+ end
117
+
118
+ it "should decrypt a hexadecimal string if encoding settings for :crypt are set to hex" do
119
+ Vidibus::Secure.settings[:crypt][:encoding] = :hex
120
+ Vidibus::Secure.decrypt(encrypted_hex, key).should eql(data)
121
+ Vidibus::Secure.settings[:crypt][:encoding] = :base64
122
+ end
123
+
124
+ it "should raise an error if given secret key is nil" do
125
+ expect { Vidibus::Secure.sign(data, nil) }.to raise_error(Vidibus::Secure::KeyError)
126
+ end
127
+ end
128
+
129
+ describe ".sign_request" do
130
+ it "should not modifiy path for POST and PUT requests" do
131
+ for verb in %w[post put]
132
+ path, params = Vidibus::Secure.sign_request(verb, "/whazzup", {}, key)
133
+ path.should eql("/whazzup")
134
+ end
135
+ end
136
+
137
+ it "should require that given params is a Hash" do
138
+ params = %w[1 2 3]
139
+ expect {
140
+ Vidibus::Secure.sign_request(:post, "/", params, key)
141
+ }.to raise_error(ArgumentError, "Given params is not a Hash.")
142
+ end
143
+
144
+ context "for requests without body" do
145
+ it "should add signature to params, if no params are given in URI and params argument is a hash" do
146
+ path = "http://vidibus.org/status"
147
+ params = {}
148
+ Vidibus::Secure.sign_request(:get, path, params, key)
149
+ path.should eql("http://vidibus.org/status")
150
+ params.should eql(:sign => "09247a2534f14e57081193ef6834b08843352c796af264f77e76445472dae9ed")
151
+ end
152
+
153
+ it "should add signature to URI, if no params are given in URI and params argument nil" do
154
+ path = "http://vidibus.org/status"
155
+ params = nil
156
+ Vidibus::Secure.sign_request(:get, path, params, key)
157
+ path.should eql("http://vidibus.org/status?sign=09247a2534f14e57081193ef6834b08843352c796af264f77e76445472dae9ed")
158
+ params.should be_nil
159
+ end
160
+
161
+ it "should add signature to URI, if params argument is a hash, but params are also given in URI" do
162
+ path = "http://vidibus.org/status?feel=good"
163
+ params = {}
164
+ Vidibus::Secure.sign_request(:get, path, params, key)
165
+ path.should eql("http://vidibus.org/status?feel=good&sign=528bbd5f791960570bd1a53ea5540d9970361b7abff72e8ecc02b12673330270")
166
+ params.should eql({})
167
+ end
168
+
169
+ it "should accept a custom name as signature param" do
170
+ path = "http://vidibus.org/status"
171
+ Vidibus::Secure.sign_request(:get, path, nil, key, "privado")
172
+ path.should eql("http://vidibus.org/status?privado=09247a2534f14e57081193ef6834b08843352c796af264f77e76445472dae9ed")
173
+ end
174
+
175
+ it "should create a signature of a given URL" do
176
+ path = "http://vidibus.org/"
177
+ Vidibus::Secure.sign_request(:get, path, nil, key)
178
+ path.should eql("http://vidibus.org/?sign=0ff9ec7056fd6a2b8ea1d2a1f462458719e3cf0b65485c55035ac906fd3d3368")
179
+ end
180
+
181
+ it "should create identical signatures for URLs with and without trailing slash" do
182
+ signature = "0ff9ec7056fd6a2b8ea1d2a1f462458719e3cf0b65485c55035ac906fd3d3368"
183
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org", nil, key).first.should match(signature)
184
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/", nil, key).first.should match(signature)
185
+ end
186
+
187
+ it "should create a signature of a given URI" do
188
+ path = "http://vidibus.org/status"
189
+ Vidibus::Secure.sign_request(:get, path, nil, key)
190
+ path.should eql("http://vidibus.org/status?sign=09247a2534f14e57081193ef6834b08843352c796af264f77e76445472dae9ed")
191
+ end
192
+
193
+ it "should create identical signatures for URIs with and without trailing slash" do
194
+ signature = "09247a2534f14e57081193ef6834b08843352c796af264f77e76445472dae9ed"
195
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/status", nil, key).first.should match(signature)
196
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/status/", nil, key).first.should match(signature)
197
+ end
198
+
199
+ it "should create a signature of URI with params" do
200
+ path = "http://vidibus.org/status?type=server"
201
+ Vidibus::Secure.sign_request(:get, path, {}, key)
202
+ path.should eql("http://vidibus.org/status?type=server&sign=afdc286310f98b36a4ad71e493a13ff35b5d841472328faadee270b6c62ca321")
203
+ end
204
+
205
+ it "should create identical signatures for URIs with params with and without trailing slash" do
206
+ signature = "afdc286310f98b36a4ad71e493a13ff35b5d841472328faadee270b6c62ca321"
207
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/status?type=server", {}, key).first.should match(signature)
208
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/status/?type=server", {}, key).first.should match(signature)
209
+ end
210
+
211
+ it "should replace signature in URI with params" do
212
+ path = "http://vidibus.org/status?interval=2&sign=something&type=server"
213
+ Vidibus::Secure.sign_request(:get, path, {}, key)
214
+ path.should eql("http://vidibus.org/status?interval=2&sign=647b0f8278ad6536b02886fa2e74ae31574941e74a7a1c1f3abe2c70b5c84625&type=server")
215
+ end
216
+
217
+ it "should replace signature in URI without other params" do
218
+ path = "http://vidibus.org/status?sign=something"
219
+ Vidibus::Secure.sign_request(:get, path, {}, key)
220
+ path.should eql("http://vidibus.org/status?sign=09247a2534f14e57081193ef6834b08843352c796af264f77e76445472dae9ed")
221
+ end
222
+
223
+ it "should create identical signatures for URIs with different params order" do
224
+ signature = "23a74d6a231961700e45b907b72fd3d47e10f7bc4618d74cb6e839d1de1b8fb7"
225
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/status?a=1&b=2", {}, key).first.should match(signature)
226
+ Vidibus::Secure.sign_request(:get, "http://vidibus.org/status/?b=2&a=1", {}, key).first.should match(signature)
227
+ end
228
+ end
229
+
230
+ context "for request with body" do
231
+ it "should create a signature of path and params" do
232
+ params = {:some => "thing"}
233
+ Vidibus::Secure.sign_request(:post, "/", params, key)
234
+ params[:some].should eql("thing")
235
+ params[:sign].should eql("1c038202044005a8da96c780b79c691af849604dab9dabd283e65271c8012aae")
236
+ end
237
+
238
+ it "should create a signature of path and nested params" do
239
+ params = {:some => {:nested => "params", :are => {:really => ["serious", "stuff"]}}}
240
+ Vidibus::Secure.sign_request(:post, "/", params, key)
241
+ params[:some].should eql({:nested => "params", :are => {:really => ["serious", "stuff"]}})
242
+ params[:sign].should eql("9419d44fc65b515b31923e2f3f4a166b384df107b61b323a1f7a3be1d7ad27f5")
243
+ end
244
+
245
+ it "should replace existing signature" do
246
+ params = {:some => "thing", :sign => "something"}
247
+ Vidibus::Secure.sign_request(:post, "/", params, key)
248
+ params[:some].should eql("thing")
249
+ params[:sign].should eql("1c038202044005a8da96c780b79c691af849604dab9dabd283e65271c8012aae")
250
+ end
251
+
252
+ it "should add signature param as string if params are given as strings" do
253
+ params = {"some" => "thing"}
254
+ Vidibus::Secure.sign_request(:post, "/", params, key)
255
+ params["some"].should eql("thing")
256
+ params["sign"].should_not be_nil
257
+ params[:sign].should be_nil
258
+ end
259
+
260
+ it "should add signature param as symbol if params are given as symbols" do
261
+ params = {:some => "thing"}
262
+ Vidibus::Secure.sign_request(:post, "/", params, key)
263
+ params[:some].should eql("thing")
264
+ params[:sign].should_not be_nil
265
+ params["sign"].should be_nil
266
+ end
267
+
268
+ it "should add signature param as symbol if no params are given" do
269
+ params = {}
270
+ Vidibus::Secure.sign_request(:post, "/", params, key)
271
+ params[:sign].should_not be_nil
272
+ end
273
+ end
274
+ end
275
+
276
+ describe ".verify_request" do
277
+ it "should return true for a valid GET request" do
278
+ path = "http://vidibus.org/status?type=server&sign=afdc286310f98b36a4ad71e493a13ff35b5d841472328faadee270b6c62ca321"
279
+ Vidibus::Secure.verify_request(:get, path, {}, key).should be_true
280
+ end
281
+
282
+ it "should return true for a valid GET request even if verb is upcase" do
283
+ path = "http://vidibus.org/status?type=server&sign=afdc286310f98b36a4ad71e493a13ff35b5d841472328faadee270b6c62ca321"
284
+ Vidibus::Secure.verify_request("GET", path, {}, key).should be_true
285
+ end
286
+
287
+ it "should return true for a valid GET request if params are given as hash" do
288
+ path = "http://vidibus.org/status"
289
+ params = {:type => "server", :sign => "afdc286310f98b36a4ad71e493a13ff35b5d841472328faadee270b6c62ca321"}
290
+ Vidibus::Secure.verify_request("GET", path, params, key).should be_true
291
+ end
292
+
293
+ it "should return false if additional params are given" do
294
+ path = "http://vidibus.org/status?type=server&sign=83d49980a04004431602a35941d2f927bfa9a2440fa04ccd2abbbad96309aa07"
295
+ Vidibus::Secure.verify_request("GET", path, { :some => "thing" }, key).should be_false
296
+ end
297
+
298
+ it "should return true for a valid POST request with params given as symbols" do
299
+ params = {:sign => "1c038202044005a8da96c780b79c691af849604dab9dabd283e65271c8012aae", :some => "thing"}
300
+ Vidibus::Secure.verify_request(:post, "/", params, key).should be_true
301
+ end
302
+
303
+ it "should return true for a valid POST request with nested params" do
304
+ params = {
305
+ :sign => "9419d44fc65b515b31923e2f3f4a166b384df107b61b323a1f7a3be1d7ad27f5",
306
+ :some => {:nested => "params", :are => {:really => ["serious", "stuff"]}}
307
+ }
308
+ Vidibus::Secure.verify_request(:post, "/", params, key).should be_true
309
+ end
310
+
311
+ it "should return true for a valid POST request with params given as string" do
312
+ params = {"sign"=>"1c038202044005a8da96c780b79c691af849604dab9dabd283e65271c8012aae", "some"=>"thing"}
313
+ Vidibus::Secure.verify_request(:post, "/", params, key).should be_true
314
+ end
315
+
316
+ it "should return false if signature is invalid" do
317
+ path = "http://vidibus.org/status?type=server&sign=invalid"
318
+ Vidibus::Secure.verify_request(:get, path, {}, key).should be_false
319
+ end
320
+
321
+ it "should return false if path does not match signature" do
322
+ path = "http://vidibus.org/invalid?type=server&sign=068dbf2695798e3cda2710ae34d74043653eae41d82cbbdf39edebd7e2ae9a50"
323
+ Vidibus::Secure.verify_request(:get, path, {}, key).should be_false
324
+ end
325
+
326
+ it "should return false if request verb does not match signature" do
327
+ path = "http://vidibus.org/status?type=server&sign=068dbf2695798e3cda2710ae34d74043653eae41d82cbbdf39edebd7e2ae9a50"
328
+ Vidibus::Secure.verify_request(:delete, path, {}, key).should be_false
329
+ end
330
+
331
+ it "should return false if params do not match signature" do
332
+ params = {"sign" => "90c71e477ea155e99b8a85b7f9ad0614e5445acfc33702cd3db614941f1a7df9", "some" => "invalid"}
333
+ Vidibus::Secure.verify_request(:post, "/", params, key).should be_false
334
+ end
335
+
336
+ it "should return false if signature does not match params" do
337
+ params = {"sign" => "invalid", "some" => "thing"}
338
+ Vidibus::Secure.verify_request(:post, "/", params, key).should be_false
339
+ end
340
+
341
+ it "should accept nil params" do
342
+ expect { Vidibus::Secure.verify_request(:get, "", nil, key) }.to_not raise_error
343
+ end
344
+ end
345
+ end
@@ -0,0 +1,75 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{vidibus-secure}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Andre Pankratz"]
12
+ s.date = %q{2010-09-23}
13
+ s.description = %q{Description...}
14
+ s.email = %q{andre@vidibus.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".bundle/config",
21
+ ".gitignore",
22
+ ".rspec",
23
+ "Gemfile",
24
+ "Gemfile.lock",
25
+ "LICENSE",
26
+ "README.rdoc",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "lib/generators/vidibus_secure_key/vidibus_secure_key_generator.rb",
30
+ "lib/vidibus-secure.rb",
31
+ "lib/vidibus/secure.rb",
32
+ "lib/vidibus/secure/extensions.rb",
33
+ "lib/vidibus/secure/extensions/controller.rb",
34
+ "lib/vidibus/secure/mongoid.rb",
35
+ "spec/spec_helper.rb",
36
+ "spec/vidibus/secure/extensions/controller_spec.rb",
37
+ "spec/vidibus/secure/mongoid_spec.rb",
38
+ "spec/vidibus/secure_spec.rb",
39
+ "vidibus-secure.gemspec"
40
+ ]
41
+ s.homepage = %q{http://github.com/vidibus/vidibus-secure}
42
+ s.rdoc_options = ["--charset=UTF-8"]
43
+ s.require_paths = ["lib"]
44
+ s.rubygems_version = %q{1.3.7}
45
+ s.summary = %q{Security tools for Vidibus applications}
46
+ s.test_files = [
47
+ "spec/spec_helper.rb",
48
+ "spec/vidibus/secure/extensions/controller_spec.rb",
49
+ "spec/vidibus/secure/mongoid_spec.rb",
50
+ "spec/vidibus/secure_spec.rb"
51
+ ]
52
+
53
+ if s.respond_to? :specification_version then
54
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
55
+ s.specification_version = 3
56
+
57
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
58
+ s.add_runtime_dependency(%q<mongoid>, ["~> 2.0.0.beta.20"])
59
+ s.add_runtime_dependency(%q<activesupport>, ["~> 3.0.0"])
60
+ s.add_runtime_dependency(%q<rack>, [">= 0"])
61
+ s.add_runtime_dependency(%q<vidibus-core_extensions>, [">= 0"])
62
+ else
63
+ s.add_dependency(%q<mongoid>, ["~> 2.0.0.beta.20"])
64
+ s.add_dependency(%q<activesupport>, ["~> 3.0.0"])
65
+ s.add_dependency(%q<rack>, [">= 0"])
66
+ s.add_dependency(%q<vidibus-core_extensions>, [">= 0"])
67
+ end
68
+ else
69
+ s.add_dependency(%q<mongoid>, ["~> 2.0.0.beta.20"])
70
+ s.add_dependency(%q<activesupport>, ["~> 3.0.0"])
71
+ s.add_dependency(%q<rack>, [">= 0"])
72
+ s.add_dependency(%q<vidibus-core_extensions>, [">= 0"])
73
+ end
74
+ end
75
+
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vidibus-secure
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Andre Pankratz
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-23 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: mongoid
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 62196427
30
+ segments:
31
+ - 2
32
+ - 0
33
+ - 0
34
+ - beta
35
+ - 20
36
+ version: 2.0.0.beta.20
37
+ type: :runtime
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ name: activesupport
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ hash: 7
48
+ segments:
49
+ - 3
50
+ - 0
51
+ - 0
52
+ version: 3.0.0
53
+ type: :runtime
54
+ version_requirements: *id002
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack
57
+ prerelease: false
58
+ requirement: &id003 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ hash: 3
64
+ segments:
65
+ - 0
66
+ version: "0"
67
+ type: :runtime
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: vidibus-core_extensions
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
80
+ version: "0"
81
+ type: :runtime
82
+ version_requirements: *id004
83
+ description: Description...
84
+ email: andre@vidibus.com
85
+ executables: []
86
+
87
+ extensions: []
88
+
89
+ extra_rdoc_files:
90
+ - LICENSE
91
+ - README.rdoc
92
+ files:
93
+ - .bundle/config
94
+ - .gitignore
95
+ - .rspec
96
+ - Gemfile
97
+ - Gemfile.lock
98
+ - LICENSE
99
+ - README.rdoc
100
+ - Rakefile
101
+ - VERSION
102
+ - lib/generators/vidibus_secure_key/vidibus_secure_key_generator.rb
103
+ - lib/vidibus-secure.rb
104
+ - lib/vidibus/secure.rb
105
+ - lib/vidibus/secure/extensions.rb
106
+ - lib/vidibus/secure/extensions/controller.rb
107
+ - lib/vidibus/secure/mongoid.rb
108
+ - spec/spec_helper.rb
109
+ - spec/vidibus/secure/extensions/controller_spec.rb
110
+ - spec/vidibus/secure/mongoid_spec.rb
111
+ - spec/vidibus/secure_spec.rb
112
+ - vidibus-secure.gemspec
113
+ has_rdoc: true
114
+ homepage: http://github.com/vidibus/vidibus-secure
115
+ licenses: []
116
+
117
+ post_install_message:
118
+ rdoc_options:
119
+ - --charset=UTF-8
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 3
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ hash: 3
137
+ segments:
138
+ - 0
139
+ version: "0"
140
+ requirements: []
141
+
142
+ rubyforge_project:
143
+ rubygems_version: 1.3.7
144
+ signing_key:
145
+ specification_version: 3
146
+ summary: Security tools for Vidibus applications
147
+ test_files:
148
+ - spec/spec_helper.rb
149
+ - spec/vidibus/secure/extensions/controller_spec.rb
150
+ - spec/vidibus/secure/mongoid_spec.rb
151
+ - spec/vidibus/secure_spec.rb