rack-private 0.1.8 → 0.2.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.
@@ -6,42 +6,61 @@ Rack::Private
6
6
  Installation
7
7
  ------------
8
8
 
9
- gem install rack-private
9
+ ``` bash
10
+ $ gem install rack-private
11
+ ```
10
12
 
11
13
  Usage
12
14
  -----
13
15
 
14
16
  ``` ruby
15
17
  require 'rack-private'
16
- use Rack::Private :code => 'secret'
18
+ use Rack::Private, :code => 'secret'
17
19
  ```
18
20
 
19
21
  You can also define multiple codes.
20
22
 
21
23
  ``` ruby
22
- use Rack::Private :codes => ['secret', 'super-secret']
24
+ use Rack::Private, :codes => ['secret', 'super-secret']
23
25
  ```
24
26
 
25
27
  And provide your own template.
26
28
 
27
29
  ``` ruby
28
- use Rack::Private :code => 'secret', :template_path => Rails.root.join("app/templates/private.html")
30
+ use Rack::Private, :code => 'secret', :template_path => Rails.root.join("app/templates/private.html")
29
31
  ```
30
32
 
31
33
  You can specify exceptions, using strings or regular expressions
32
34
 
33
35
  ``` ruby
34
- use Rack::Private :code => 'secret', :except => ["public"]
36
+ use Rack::Private, :code => 'secret', :except => ["public"]
35
37
  ```
36
38
 
37
39
  This will allow access to *any* URL containing 'public'. If you want more control, use a regular expression:
38
40
 
39
41
  ``` ruby
40
- use Rack::Private :code => 'secret', :except => [/public$/]
42
+ use Rack::Private, :code => 'secret', :except => [/public$/]
41
43
  ```
42
44
 
43
45
  This will only allow access to URLs that *end* in 'public'. You can use any expressions you want.
44
46
 
47
+ If you have a lot of exceptions, you can specify a block
48
+
49
+ ``` ruby
50
+ use Rack::Private, :code => 'secret' do
51
+ except /foo$/
52
+ except 'public'
53
+ end
54
+ ```
55
+
56
+ You can also specify a HTTP method in the block form
57
+
58
+ ``` ruby
59
+ use Rack::Private, :code => 'secret' do
60
+ except /foo$/, :method => 'post'
61
+ except 'public', :method => :get
62
+ end
63
+ ```
45
64
 
46
65
  Note on Patches/Pull Requests
47
66
  -----------------------------
@@ -55,4 +74,4 @@ Note on Patches/Pull Requests
55
74
  Author
56
75
  ------
57
76
 
58
- * [Thibaud Guillaume-Gentil](http://github.com/thibaudgg)
77
+ [Thibaud Guillaume-Gentil](http://github.com/thibaudgg)
@@ -1,9 +1,16 @@
1
1
  module Rack
2
2
  class Private
3
3
 
4
- def initialize(app, options = {})
4
+ def initialize(app, options = {}, &block)
5
5
  @app = app
6
6
  @options = options
7
+ @exceptions = []
8
+
9
+ unless options[:except].nil?
10
+ options[:except].each {|exception| except(exception) }
11
+ end
12
+
13
+ instance_eval(&block) if block_given?
7
14
  end
8
15
 
9
16
  def call(env)
@@ -45,9 +52,26 @@ module Rack
45
52
 
46
53
  # Checks if the url matches one of our exception strings or regexs
47
54
  def public_page?(request)
48
- @options[:except] && @options[:except].find {|x| request.url.match(x)}
55
+ @exceptions.find {|exception| exception?(request, exception)}
56
+ end
57
+
58
+ def exception?(request, exception)
59
+ path, method = *exception
60
+ matches_path?(request, path) && matches_method?(request, method)
61
+ end
62
+
63
+ def matches_path?(request, path)
64
+ request.url.match(path)
65
+ end
66
+
67
+ def matches_method?(request, method)
68
+ return true if method.nil?
69
+ request.request_method.downcase == method.values.first.downcase.to_s
70
+ end
71
+
72
+ def except(match, method = nil)
73
+ @exceptions << [match, method]
49
74
  end
50
-
51
75
  end
52
76
  end
53
77
 
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  class Private
3
- VERSION = "0.1.8"
3
+ VERSION = "0.2.0"
4
4
  end
5
- end
5
+ end
metadata CHANGED
@@ -1,71 +1,88 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rack-private
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
4
5
  prerelease:
5
- version: 0.1.8
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Thibaud Guillaume-Gentil
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-05-06 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2012-07-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: bundler
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 1.0.0
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
24
22
  type: :development
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: shoulda
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: shoulda
32
+ requirement: !ruby/object:Gem::Requirement
30
33
  none: false
31
- requirements:
32
- - - ~>
33
- - !ruby/object:Gem::Version
34
- version: 2.11.3
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
35
38
  type: :development
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: rack
39
39
  prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rack
48
+ requirement: !ruby/object:Gem::Requirement
41
49
  none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: 1.2.0
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
46
54
  type: :development
47
- version_requirements: *id003
48
- - !ruby/object:Gem::Dependency
49
- name: rack-test
50
55
  prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rack-test
64
+ requirement: !ruby/object:Gem::Requirement
52
65
  none: false
53
- requirements:
54
- - - ~>
55
- - !ruby/object:Gem::Version
56
- version: 0.5.4
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
57
70
  type: :development
58
- version_requirements: *id004
59
- description: Private Rack middleware purpose is to protect your Rack application from anonymous via a secret code form.
60
- email:
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Private Rack middleware purpose is to protect your Rack application from
79
+ anonymous via a secret code form.
80
+ email:
61
81
  - thibaud@thibaud.me
62
82
  executables: []
63
-
64
83
  extensions: []
65
-
66
84
  extra_rdoc_files: []
67
-
68
- files:
85
+ files:
69
86
  - lib/rack/private/index.html
70
87
  - lib/rack/private/version.rb
71
88
  - lib/rack/private.rb
@@ -74,30 +91,29 @@ files:
74
91
  - README.markdown
75
92
  homepage: http://github.com/thibaudgg/rack-private
76
93
  licenses: []
77
-
78
94
  post_install_message:
79
95
  rdoc_options: []
80
-
81
- require_paths:
96
+ require_paths:
82
97
  - lib
83
- required_ruby_version: !ruby/object:Gem::Requirement
98
+ required_ruby_version: !ruby/object:Gem::Requirement
84
99
  none: false
85
- requirements:
86
- - - ">="
87
- - !ruby/object:Gem::Version
88
- version: "0"
89
- required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ segments:
105
+ - 0
106
+ hash: -4059976681787191131
107
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
108
  none: false
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
109
+ requirements:
110
+ - - ! '>='
111
+ - !ruby/object:Gem::Version
94
112
  version: 1.3.6
95
113
  requirements: []
96
-
97
114
  rubyforge_project: rack-private
98
- rubygems_version: 1.8.1
115
+ rubygems_version: 1.8.24
99
116
  signing_key:
100
117
  specification_version: 3
101
118
  summary: Protect your Rack application from anonymous.
102
119
  test_files: []
103
-