concealer 0.0.2 → 0.1.0
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.
- data/.gitignore +2 -1
- data/.travis.yml +8 -0
- data/Rakefile +12 -0
- data/concealer.gemspec +3 -2
- data/lib/concealer.rb +38 -2
- data/lib/concealer/proxy.rb +10 -1
- data/lib/concealer/strategy/multi_level.rb +1 -1
- data/lib/concealer/version.rb +1 -1
- data/spec/concealer/fallback/string_spec.rb +4 -0
- data/spec/concealer/proxy_spec.rb +14 -1
- data/spec/concealer/strategy/multi_level_spec.rb +12 -0
- metadata +51 -75
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/Rakefile
CHANGED
@@ -2,9 +2,21 @@ require 'bundler'
|
|
2
2
|
require 'bundler/setup'
|
3
3
|
|
4
4
|
require 'rspec/core/rake_task'
|
5
|
+
require 'rdoc/task'
|
5
6
|
|
6
7
|
Bundler::GemHelper.install_tasks
|
7
8
|
|
9
|
+
spec = Gem::Specification.load("concealer.gemspec")
|
10
|
+
|
8
11
|
RSpec::Core::RakeTask.new(:spec)
|
9
12
|
|
13
|
+
RDoc::Task.new do |rdoc|
|
14
|
+
rdoc.rdoc_dir = 'doc'
|
15
|
+
rdoc.main = "README.rdoc"
|
16
|
+
rdoc.options += spec.rdoc_options
|
17
|
+
rdoc.rdoc_files.include(spec.extra_rdoc_files)
|
18
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
19
|
+
rdoc.title = "#{spec.name} #{spec.version}"
|
20
|
+
end
|
21
|
+
|
10
22
|
task :default => :spec
|
data/concealer.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
2
3
|
$:.push File.expand_path("../lib", __FILE__)
|
3
4
|
require "concealer/version"
|
4
5
|
|
@@ -19,6 +20,6 @@ Gem::Specification.new do |s|
|
|
19
20
|
|
20
21
|
s.add_runtime_dependency('activesupport', ['~> 3.0'])
|
21
22
|
|
22
|
-
s.add_development_dependency('rspec', ['~> 2.
|
23
|
+
s.add_development_dependency('rspec', ['~> 2.6'])
|
23
24
|
s.add_development_dependency('rake')
|
24
25
|
end
|
data/lib/concealer.rb
CHANGED
@@ -9,34 +9,70 @@ module Concealer
|
|
9
9
|
autoload :Strategy, 'concealer/strategy'
|
10
10
|
autoload :Fallback, 'concealer/fallback'
|
11
11
|
|
12
|
+
##
|
13
|
+
# :singleton-method: default_fallback=
|
14
|
+
# :call-seq:
|
15
|
+
# default_fallback=(fallback)
|
16
|
+
#
|
17
|
+
|
18
|
+
##
|
19
|
+
# :singleton-method: default_fallback
|
20
|
+
# Returns the set default fallback. If not explicitly set to something else
|
21
|
+
# it is Concealer::Fallback::Nil.
|
12
22
|
mattr_accessor :default_fallback
|
13
23
|
@@default_fallback = Concealer::Fallback::Nil.new
|
14
24
|
|
25
|
+
##
|
26
|
+
# Sets the strategy concealer uses to check permissions
|
27
|
+
#
|
15
28
|
def self.strategy=(strategy)
|
16
29
|
Thread.current[:concealer_strategy] = strategy
|
17
30
|
end
|
18
31
|
|
32
|
+
##
|
33
|
+
# Returns the strategy that's set for concealer. Default is Concealer::Strategy::Allow
|
34
|
+
#
|
19
35
|
def self.strategy
|
20
36
|
Thread.current[:concealer_strategy] || Concealer::Strategy::Allow.new
|
21
37
|
end
|
22
38
|
|
39
|
+
##
|
40
|
+
# Executes the block with the given strategy.
|
41
|
+
#
|
23
42
|
def self.with_strategy(strategy)
|
24
43
|
save, self.strategy = self.strategy, strategy
|
25
44
|
yield
|
26
45
|
self.strategy = save
|
27
46
|
end
|
28
47
|
|
48
|
+
##
|
49
|
+
# Registers a new fallback for the given method on the given model
|
50
|
+
#
|
29
51
|
def self.register_fallback(model, method, fallback)
|
52
|
+
name = model.is_a?(Symbol) ? model : model.to_s.to_sym
|
30
53
|
@@fallbacks ||= {}
|
31
|
-
@@fallbacks[
|
32
|
-
@@fallbacks[
|
54
|
+
@@fallbacks[name] ||= {}
|
55
|
+
@@fallbacks[name][method] = fallback
|
33
56
|
end
|
34
57
|
|
58
|
+
##
|
59
|
+
# Returns the set fallback for the given method on the given model
|
60
|
+
# If none is set it returns the default fallback set with Concealer.default_fallback=
|
61
|
+
#
|
35
62
|
def self.fallback_for(model, method)
|
36
63
|
@@fallbacks ||= {}
|
37
64
|
@@fallbacks.try(:[], model.class.to_s.to_sym).try(:[], method.to_sym) || @@default_fallback
|
38
65
|
end
|
39
66
|
|
67
|
+
##
|
68
|
+
# Accesses the current object using Concealer to check method calls
|
69
|
+
#
|
70
|
+
# Example:
|
71
|
+
# Concealer.strategy = Concealer::Strategy::Deny.new
|
72
|
+
# user = User.new(:name => "Christian")
|
73
|
+
# user.name # => Christian
|
74
|
+
# user.concealed.name # => nil
|
75
|
+
#
|
40
76
|
def concealed
|
41
77
|
Proxy.new(self, Concealer.strategy)
|
42
78
|
end
|
data/lib/concealer/proxy.rb
CHANGED
@@ -10,7 +10,16 @@ module Concealer
|
|
10
10
|
protected
|
11
11
|
|
12
12
|
def method_missing(name, *args, &block)
|
13
|
-
|
13
|
+
|
14
|
+
check_concealed = /(.+)_allowed\?$/.match(name.to_s).try(:[], 1).try(:to_sym)
|
15
|
+
|
16
|
+
if check_concealed && @target.respond_to?(check_concealed)
|
17
|
+
return @strategy.allow?(@target, check_concealed, args)
|
18
|
+
end
|
19
|
+
|
20
|
+
if !@target.respond_to?(name)
|
21
|
+
raise NoMethodError, "#{@target} does not respond to #{name}"
|
22
|
+
elsif @strategy.allow?(@target, name, args)
|
14
23
|
@target.send(name, *args, &block)
|
15
24
|
else
|
16
25
|
Concealer.fallback_for(@target, name).call(@target, name, args)
|
@@ -7,7 +7,7 @@ class Concealer::Strategy::MultiLevel < Concealer::Strategy
|
|
7
7
|
|
8
8
|
def allow?(model, method, args)
|
9
9
|
required_level = required_level_for(model, method, args)
|
10
|
-
actual_level = @current_user.relation_level_to
|
10
|
+
actual_level = @current_user.try(:relation_level_to, owner_of(model)) || @levels.last
|
11
11
|
|
12
12
|
raise "The level #{required_level} is not valid." unless @levels.include?(required_level)
|
13
13
|
raise "The level #{actual_level} is not valid." unless @levels.include?(actual_level)
|
data/lib/concealer/version.rb
CHANGED
@@ -5,5 +5,9 @@ describe Concealer::Fallback::String do
|
|
5
5
|
it "should return an empty string" do
|
6
6
|
subject.call(nil, nil, nil).should eq("")
|
7
7
|
end
|
8
|
+
|
9
|
+
it "should return the string given on initialization" do
|
10
|
+
Concealer::Fallback::String.new("some string").call(nil, nil, nil).should eq("some string")
|
11
|
+
end
|
8
12
|
end
|
9
13
|
end
|
@@ -12,7 +12,7 @@ describe Concealer::Proxy do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should accept a target object and a strategy" do
|
15
|
-
expect { Concealer::Proxy.new(model,
|
15
|
+
expect { Concealer::Proxy.new(model, strategy) }.to_not raise_error ArgumentError
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -34,4 +34,17 @@ describe Concealer::Proxy do
|
|
34
34
|
|
35
35
|
subject.allowed_method.should eq(:fallback)
|
36
36
|
end
|
37
|
+
|
38
|
+
it "should return false for allowed_method_allowed?" do
|
39
|
+
subject.allowed_method_allowed?.should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should return true for denied_method_allowed?" do
|
43
|
+
strategy.stub!(:allow?).and_return(false)
|
44
|
+
subject.denied_method_allowed?.should be_false
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should raise an NoMethodError when the target doesn't respond to a given method" do
|
48
|
+
expect { subject.some_missing_method }.to raise_error NoMethodError, /does not respond to some_missing_method/
|
49
|
+
end
|
37
50
|
end
|
@@ -9,6 +9,18 @@ describe Concealer::Strategy::MultiLevel do
|
|
9
9
|
|
10
10
|
subject { Concealer::Strategy::MultiLevel.new(current_user, levels) }
|
11
11
|
|
12
|
+
context 'with no current_user given' do
|
13
|
+
subject { Concealer::Strategy::MultiLevel.new(nil, levels) }
|
14
|
+
|
15
|
+
before(:each) do
|
16
|
+
subject.stub!(:required_level_for).and_return(:friends_of_friends)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should deny the call" do
|
20
|
+
subject.allow?(other_user, :name, nil).should be_false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
12
24
|
context 'required level higher than actual level' do
|
13
25
|
before(:each) do
|
14
26
|
subject.stub!(:required_level_for).and_return(:myself)
|
metadata
CHANGED
@@ -1,81 +1,61 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: concealer
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 2
|
10
|
-
version: 0.0.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Benedikt Deicke
|
14
|
-
-
|
9
|
+
- Christian Bäuerlein
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: &id001 !ruby/object:Gem::Requirement
|
13
|
+
date: 2012-02-15 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activesupport
|
17
|
+
requirement: &70240046174920 !ruby/object:Gem::Requirement
|
25
18
|
none: false
|
26
|
-
requirements:
|
19
|
+
requirements:
|
27
20
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 3
|
32
|
-
- 0
|
33
|
-
version: "3.0"
|
34
|
-
requirement: *id001
|
35
|
-
name: activesupport
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.0'
|
36
23
|
type: :runtime
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
24
|
prerelease: false
|
39
|
-
version_requirements:
|
25
|
+
version_requirements: *70240046174920
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: &70240046184280 !ruby/object:Gem::Requirement
|
40
29
|
none: false
|
41
|
-
requirements:
|
30
|
+
requirements:
|
42
31
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
segments:
|
46
|
-
- 2
|
47
|
-
- 3
|
48
|
-
version: "2.3"
|
49
|
-
requirement: *id002
|
50
|
-
name: rspec
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.6'
|
51
34
|
type: :development
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
35
|
prerelease: false
|
54
|
-
version_requirements:
|
55
|
-
|
56
|
-
requirements:
|
57
|
-
- - ">="
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
hash: 3
|
60
|
-
segments:
|
61
|
-
- 0
|
62
|
-
version: "0"
|
63
|
-
requirement: *id003
|
36
|
+
version_requirements: *70240046184280
|
37
|
+
- !ruby/object:Gem::Dependency
|
64
38
|
name: rake
|
39
|
+
requirement: &70240046608520 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
65
45
|
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *70240046608520
|
66
48
|
description: Privacy control your models with ease
|
67
|
-
email:
|
49
|
+
email:
|
68
50
|
- benedikt@synatic.net
|
69
51
|
- fabrik42@gmail.com
|
70
52
|
executables: []
|
71
|
-
|
72
53
|
extensions: []
|
73
|
-
|
74
54
|
extra_rdoc_files: []
|
75
|
-
|
76
|
-
files:
|
55
|
+
files:
|
77
56
|
- .gitignore
|
78
57
|
- .rspec
|
58
|
+
- .travis.yml
|
79
59
|
- Gemfile
|
80
60
|
- LICENSE
|
81
61
|
- README.rdoc
|
@@ -114,41 +94,37 @@ files:
|
|
114
94
|
- spec/support/concealed_model.rb
|
115
95
|
- spec/support/paperclip.rb
|
116
96
|
- spec/support/user.rb
|
117
|
-
has_rdoc: true
|
118
97
|
homepage: https://flinc.github.com/concealer
|
119
98
|
licenses: []
|
120
|
-
|
121
99
|
post_install_message:
|
122
100
|
rdoc_options: []
|
123
|
-
|
124
|
-
require_paths:
|
101
|
+
require_paths:
|
125
102
|
- lib
|
126
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
104
|
none: false
|
128
|
-
requirements:
|
129
|
-
- -
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
|
132
|
-
segments:
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
segments:
|
133
110
|
- 0
|
134
|
-
|
135
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
hash: -1897724190148084110
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
113
|
none: false
|
137
|
-
requirements:
|
138
|
-
- -
|
139
|
-
- !ruby/object:Gem::Version
|
140
|
-
|
141
|
-
segments:
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
segments:
|
142
119
|
- 0
|
143
|
-
|
120
|
+
hash: -1897724190148084110
|
144
121
|
requirements: []
|
145
|
-
|
146
122
|
rubyforge_project:
|
147
|
-
rubygems_version: 1.
|
123
|
+
rubygems_version: 1.8.15
|
148
124
|
signing_key:
|
149
125
|
specification_version: 3
|
150
126
|
summary: Privacy control your models with ease
|
151
|
-
test_files:
|
127
|
+
test_files:
|
152
128
|
- spec/concealer/fallback/nil_spec.rb
|
153
129
|
- spec/concealer/fallback/paperclip_spec.rb
|
154
130
|
- spec/concealer/fallback/string_spec.rb
|