rack-logs 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0a1cdc66577d3ba82418770cc9ca462b3f81581
4
- data.tar.gz: a9c6ce4f050fac22cff08d242acb0e1c553b3173
3
+ metadata.gz: 38f658a84c8b8956be836e3812a3a8362ee03f7d
4
+ data.tar.gz: c0e31cdcd0de005e773eb4aeaa00f6eb276f0e44
5
5
  SHA512:
6
- metadata.gz: a3a948077177fc75c6bda202e718d534331637175f6ab55395b68a6835d2f2fa393c2a20f93ed167bb296411692d6f8479d381fda172eb418f40949786e7bc98
7
- data.tar.gz: e373503195bfcb176e4039c416f38f308604c771d32197d0805624cd9b386c6793d27ab2a1849e76224950b60eaf0b6383f13072d17423b595c59fc691220173
6
+ metadata.gz: 7a952da98a94f7af5c0a2fd66483d60d0684e33d9c3bef6519c96eba97749afaa9b11b6824aa8fba194358f864d774db0b8dbcee261af6fc35afaf1374df47e9
7
+ data.tar.gz: 72b85e5be9e67ebd24e42b44726886236721816b46e7e0073992d1339ff9452b3fd5dacd8ddc1fff14b0656494c471b64adc7ac5f540ec7690778c6caba06afe
data/.gitignore CHANGED
@@ -1,3 +1,3 @@
1
1
  Gemfile.lock
2
2
  pkg
3
- tmp
3
+ /tmp
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  module Logs
3
- VERSION = "0.0.3"
3
+ VERSION = "0.0.4"
4
4
  end
5
5
  end
@@ -8,7 +8,12 @@ module Rack
8
8
  attr_reader :config
9
9
 
10
10
  def call env
11
- [200, headers, joined_logs]
11
+ contents = joined_logs(env.fetch('PATH_INFO','/'))
12
+ if contents.empty?
13
+ [404, headers, ['No Such File']]
14
+ else
15
+ [200, headers, contents]
16
+ end
12
17
  end
13
18
 
14
19
  private
@@ -27,6 +32,10 @@ module Rack
27
32
  @lines = lines
28
33
  end
29
34
 
35
+ def empty?
36
+ @filenames.empty?
37
+ end
38
+
30
39
  def each &block
31
40
  @filenames.each do |filename|
32
41
  block.call "## #{filename}\n\n"
@@ -46,8 +55,8 @@ module Rack
46
55
  end
47
56
  end
48
57
 
49
- def joined_logs
50
- JoinedFiles.new files, @config.lines
58
+ def joined_logs path
59
+ JoinedFiles.new files(path), @config.lines
51
60
  end
52
61
 
53
62
  def logs
@@ -57,8 +66,10 @@ module Rack
57
66
  end
58
67
  end
59
68
 
60
- def files
61
- Dir[@config.log_dir+'/'+@config.pattern]
69
+ def files path
70
+ Dir[@config.log_dir+'/'+@config.pattern].select do |filename|
71
+ filename =~ Regexp.new( @config.log_dir + path )
72
+ end
62
73
  end
63
74
 
64
75
  end
data/rack-logs.gemspec CHANGED
@@ -21,7 +21,6 @@ Gem::Specification.new do |spec|
21
21
  spec.add_runtime_dependency "rack", "~> 1.5.2"
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
- spec.add_development_dependency "fakefs"
25
24
  spec.add_development_dependency "rake"
26
25
  spec.add_development_dependency "rack-test"
27
26
  spec.add_development_dependency "rspec", "~> 3.0.0.beta1"
@@ -0,0 +1,39 @@
1
+ require 'rack/test'
2
+ require 'rack/logs'
3
+
4
+ describe 'accessing an individual log', type: :integration do
5
+ include Rack::Test::Methods
6
+
7
+ let(:app) do
8
+ Rack::Builder.app do
9
+ logs = Rack::Logs.configure do |config|
10
+ config.log_dir = './tmp'
11
+ end
12
+ run logs
13
+ end
14
+ end
15
+
16
+ before do
17
+ File.open('./tmp/my_log_file.log','w') do |f|
18
+ f.write "LOG ENTRY 1234"
19
+ end
20
+ File.open('./tmp/other_file.log','w') do |f|
21
+ f.write "LOG ENTRY 5678"
22
+ end
23
+ get '/my_log_file.log'
24
+ end
25
+
26
+ example 'returns a 200 response code' do
27
+ expect(last_response).to be_ok
28
+ end
29
+
30
+ example 'accessing the log returns only the specific log contents' do
31
+ expect(last_response.body).to match 'LOG ENTRY 1234'
32
+ expect(last_response.body).to_not match 'LOG ENTRY 5678'
33
+ end
34
+
35
+ example 'cross path traversal is prevented' do
36
+ get "/../tmp/secret_file.txt"
37
+ expect(last_response.status).to be 404
38
+ end
39
+ end
@@ -9,11 +9,8 @@ describe 'running `Rack::Logs` via `Rack::Builder`', type: :integration do
9
9
 
10
10
  before { get '/' }
11
11
 
12
- example 'returns a 200 response code' do
13
- expect(last_response).to be_ok
14
- end
15
- example 'returns no logs because there are no files' do
16
- expect(last_response.body).to eq ''
12
+ example 'returns a 404 response code because there are no files' do
13
+ expect(last_response.status).to eq 404
17
14
  end
18
15
  end
19
16
 
data/spec/spec_helper.rb CHANGED
@@ -1 +1,11 @@
1
1
  # required by .rspec
2
+
3
+ module Support
4
+ def support_path path
5
+ File.join File.expand_path('../support', __FILE__), path
6
+ end
7
+ end
8
+
9
+ RSpec.configure do |c|
10
+ c.include Support
11
+ end
@@ -0,0 +1,6 @@
1
+ Ignored
2
+
3
+
4
+
5
+
6
+ Much log, such information
@@ -0,0 +1 @@
1
+ Nothing to see here
@@ -0,0 +1,6 @@
1
+ Ignored
2
+
3
+
4
+
5
+
6
+ Other log, such information
@@ -0,0 +1 @@
1
+ S3kr1t!
@@ -1,8 +1,10 @@
1
- require 'fakefs/safe'
2
1
  require 'rack/logs/viewer'
3
2
 
4
3
  describe 'Rack::Logs::Viewer' do
5
- let(:config) { instance_double "Rack::Logs::Config", pattern: '*.doge', log_dir: './tmp', lines: 5 }
4
+ let(:config) do
5
+ instance_double "Rack::Logs::Config", lines: 5, pattern: '*.doge',
6
+ log_dir: support_path('fixtures/log')
7
+ end
6
8
 
7
9
  describe '#initialize' do
8
10
  it 'takes a configuration' do
@@ -12,37 +14,58 @@ describe 'Rack::Logs::Viewer' do
12
14
 
13
15
  describe '#call env' do
14
16
  let(:viewer) { Rack::Logs::Viewer.new config }
15
- let(:response) { viewer.call({}) }
16
17
  let(:contents) { response[2].inject("") { |contents, fragment| contents + fragment } }
17
18
 
18
- before do
19
- FakeFS.activate!
20
- FileUtils.mkdir_p('./tmp')
21
- File.open('./tmp/not_log.txt','w') { |file| file.write 'Nothing to see here' }
22
- File.open('./tmp/my_log.doge','w') do |file|
23
- file.write "Ignored"
24
- 4.times do
25
- file.write $/
26
- end
27
- file.write "Much log, such information"
19
+ shared_examples_for "a rack logs response" do
20
+ it 'returns a rack response' do
21
+ expect(response[0]).to be_a Fixnum
22
+ expect(response[1]).to be_a Hash
23
+ expect(response[1].keys).to include 'Content-Type'
24
+ expect(response[2].respond_to? :each).to be true
25
+ end
26
+
27
+ it 'limits itself to the last n lines' do
28
+ expect(contents).to_not match "Ignored"
28
29
  end
29
- end
30
- after do
31
- FakeFS.deactivate!
32
30
  end
33
31
 
34
- it 'returns a rack response' do
35
- expect(response[0]).to be_a Fixnum
36
- expect(response[1]).to be_a Hash
37
- expect(response[1].keys).to include 'Content-Type'
38
- expect(response[2].respond_to? :each).to be true
32
+ context "for all files" do
33
+ let(:response) { viewer.call({}) }
34
+
35
+ it_should_behave_like "a rack logs response"
36
+
37
+ it 'returns the contents of all the logs' do
38
+ expect(contents).to match "log/my_log\.doge\n\n"
39
+ expect(contents).to match "Much log, such information"
40
+ expect(contents).to match "log/other_log\.doge\n\n"
41
+ expect(contents).to match "Other log, such information"
42
+ end
39
43
  end
40
- it 'returns the contents of the logs' do
41
- expect(contents).to match "## tmp/my_log\.doge\n\n"
42
- expect(contents).to match "Much log, such information"
44
+
45
+ context "for a file" do
46
+ let(:response) { viewer.call({ 'PATH_INFO' => '/my_log.doge' }) }
47
+
48
+ it_should_behave_like "a rack logs response"
49
+
50
+ it 'returns the contents the specific log' do
51
+ expect(contents).to match "log/my_log\.doge\n\n"
52
+ expect(contents).to match "Much log, such information"
53
+ end
54
+ it 'ignores other contents' do
55
+ expect(contents).to_not match "log/other_log\.doge\n\n"
56
+ expect(contents).to_not match "Other log, such information"
57
+ end
43
58
  end
44
- it 'limits itself to the last n lines' do
45
- expect(contents).to_not match "Ignored"
59
+
60
+ context "for a forbidden file" do
61
+ let(:response) { viewer.call({ 'PATH_INFO' => '/../tmp/secret_file.txt' }) }
62
+
63
+ it 'returns a 404 rack response' do
64
+ expect(response[0]).to eq 404
65
+ expect(response[1]).to be_a Hash
66
+ expect(response[1].keys).to include 'Content-Type'
67
+ expect(response[2]).to eq ['No Such File']
68
+ end
46
69
  end
47
70
  end
48
71
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-logs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Rowe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-03 00:00:00.000000000 Z
11
+ date: 2014-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.3'
41
- - !ruby/object:Gem::Dependency
42
- name: fakefs
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: rake
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -114,8 +100,13 @@ files:
114
100
  - lib/rack/logs/version.rb
115
101
  - lib/rack/logs/viewer.rb
116
102
  - rack-logs.gemspec
103
+ - spec/integration/accessing_an_individual_log_spec.rb
117
104
  - spec/integration/running_rack_logs_via_rack_spec.rb
118
105
  - spec/spec_helper.rb
106
+ - spec/support/fixtures/log/my_log.doge
107
+ - spec/support/fixtures/log/not_log.txt
108
+ - spec/support/fixtures/log/other_log.doge
109
+ - spec/support/fixtures/tmp/secret_file.txt
119
110
  - spec/unit/rack/logs/config_spec.rb
120
111
  - spec/unit/rack/logs/viewer_spec.rb
121
112
  - spec/unit/rack/logs_spec.rb
@@ -145,8 +136,13 @@ signing_key:
145
136
  specification_version: 4
146
137
  summary: Simple rack based log viewer
147
138
  test_files:
139
+ - spec/integration/accessing_an_individual_log_spec.rb
148
140
  - spec/integration/running_rack_logs_via_rack_spec.rb
149
141
  - spec/spec_helper.rb
142
+ - spec/support/fixtures/log/my_log.doge
143
+ - spec/support/fixtures/log/not_log.txt
144
+ - spec/support/fixtures/log/other_log.doge
145
+ - spec/support/fixtures/tmp/secret_file.txt
150
146
  - spec/unit/rack/logs/config_spec.rb
151
147
  - spec/unit/rack/logs/viewer_spec.rb
152
148
  - spec/unit/rack/logs_spec.rb