auditing-middleware 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: df9d2a6b89d0e94494653788c85d7f44693a12f8
4
+ data.tar.gz: 721339db5d1a2ec9189601906ca63b6b4edd6201
5
+ SHA512:
6
+ metadata.gz: 41138c25488d63a7e0172bc1d36be1d81bb5ad1a41b02f9d38a3b79070b2ef36a04fa97ea12dadb7795730c62f1906f4f2b3de1abe2c0a571415cab7316c32d3
7
+ data.tar.gz: c48f5065a9873bd563a9a3794c2f827e5551912dcf9456e7976b4369922573536d82b108154bec849f35f65acfb338c6f5960670b3e0e14d03aafd8f59bc89a2
@@ -0,0 +1,15 @@
1
+ ./prototype/.byebug_history
2
+ /.bundle/
3
+ /.yardoc
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
11
+ *.bundle
12
+ *.so
13
+ *.o
14
+ *.a
15
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in auditing-middleware.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2016 daneb
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,61 @@
1
+ # Auditing::Middleware
2
+ Provides logging support to middleware.
3
+
4
+ ## Installation
5
+
6
+ Add this line to your application's Gemfile:
7
+
8
+ ```ruby
9
+ gem 'auditing_middleware'
10
+ ```
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install auditing_middleware
19
+
20
+ ## Dependencies
21
+ * [SoarAspects](https://rubygems.org/gems/soar_aspects) - for loading auditor into environment variable
22
+ * [SoarAuditorApi](https://rubygems.org/gems/soar_auditor_api) - support for 'some' Audit Provider
23
+
24
+ ## Usage
25
+
26
+ Setting up an Audit Provider
27
+
28
+ ```ruby
29
+ configuration = { "preprefix" => "very important:" }
30
+ auditor = SanityAuditor.new
31
+ auditor.configure(configuration)
32
+ auditor.set_audit_level(:error)
33
+ ```
34
+
35
+ Using Soar Aspect
36
+
37
+ ```ruby
38
+ SoarAspects::Aspects::auditing = auditor
39
+ ```
40
+
41
+ Add support to Rack Middleware
42
+
43
+ ```ruby
44
+ def call(env)
45
+ @app.call(env)
46
+ rescue => exception
47
+ Auditing::Middleware.error(exception)
48
+ end
49
+ ```
50
+
51
+ ## Contributing
52
+
53
+ Please send feedback and comments to the author at:
54
+
55
+ Dane-Garrin Balia <dane.balia@hetzner.co.za>
56
+
57
+ This gem is sponsored by Hetzner (Pty) Ltd - http://hetzner.co.za
58
+
59
+ ## License
60
+
61
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'auditing/middleware/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "auditing-middleware"
8
+ spec.version = Auditing::Middleware::VERSION
9
+ spec.authors = ["daneb"]
10
+ spec.email = ["dane.balia@hetzner.co.za"]
11
+ spec.summary = %q{Logging trace events in Rack Middleware}
12
+ spec.homepage = "https://github.com/hetznerZA/auditing_middleware"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.7"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "rspec", "~> 3.5", '>= 3.5.0'
23
+ spec.add_development_dependency "rack", "~> 1.6", '>= 1.6.4'
24
+ spec.add_development_dependency "byebug", "~> 9.0", '>= 9.0.5'
25
+ spec.add_dependency "soar_aspects", "~> 0.1.2"
26
+ spec.add_dependency "soar_auditor_api", "~> 0.0.12"
27
+ end
@@ -0,0 +1,46 @@
1
+ require "auditing/middleware/version"
2
+ require 'soar_aspects'
3
+
4
+ module Auditing
5
+ module Middleware
6
+ class Error < StandardError; end
7
+
8
+ def self.error(ruby_error)
9
+ log_detail(ENV['RACK_ENV'], ruby_error, :error)
10
+ end
11
+
12
+ def self.info(ruby_error)
13
+ log_detail(ENV['RACK_ENV'], ruby_error, :info)
14
+ end
15
+
16
+ def self.warn(ruby_error)
17
+ log_detail(ENV['RACK_ENV'], ruby_error, :warn)
18
+ end
19
+
20
+ def self.debug(ruby_error)
21
+ log_detail(ENV['RACK_ENV'], ruby_error, :debug)
22
+ end
23
+
24
+ def self.fatal(ruby_error)
25
+ log_detail(ENV['RACK_ENV'], ruby_error, :fatal)
26
+ end
27
+
28
+ private
29
+ def self.log_detail(rack_env, ruby_error, audit_level)
30
+ if rack_env == 'development'
31
+ what_to_log = ruby_error.respond_to?(:backtrace) ? "#{ruby_error.message} #{ruby_error.backtrace}" : ruby_error
32
+ log_to_location(what_to_log , audit_level)
33
+ else
34
+ log_to_location(ruby_error, audit_level)
35
+ end
36
+ rescue => exception
37
+ Error.new("Unexpected exception: #{exception}")
38
+ end
39
+
40
+ def self.log_to_location(what_to_log, audit_level)
41
+ auditor = SoarAspects::Aspects.auditing
42
+ return STDERR.puts what_to_log if auditor.nil?
43
+ auditor.send(audit_level, what_to_log)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ module Auditing
2
+ module Middleware
3
+ VERSION = "0.0.3"
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ require 'soar_auditor_api'
2
+
3
+ class SanityAuditor < SoarAuditorApi::AuditorAPI
4
+ def configuration_is_valid?(configuration)
5
+ return configuration.include?("preprefix")
6
+ end
7
+
8
+ def audit(data)
9
+ puts @configuration["preprefix"] + data
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ require 'rack/lobster'
2
+ require 'soar_aspects'
3
+ require './auditor'
4
+ require './some_middleware'
5
+
6
+ configuration = { "preprefix" => "very important:" }
7
+ auditor = SanityAuditor.new
8
+ auditor.configure(configuration)
9
+ auditor.set_audit_level(:error)
10
+ SoarAspects::Aspects::auditing = nil
11
+ use SoarAspects::Aspects
12
+ use Shrimp
13
+
14
+ run Rack::Lobster.new
@@ -0,0 +1,33 @@
1
+ require_relative '../lib/auditing/middleware.rb'
2
+
3
+ class Shrimp
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ raise StandardError.new('What now! Kapow!')
10
+ @app.call(env)
11
+ rescue => exception
12
+ Auditing::Middleware.error(exception)
13
+ end
14
+ end
15
+
16
+ # private
17
+ # def error(env, ruby_error)
18
+ # log_detail(env['RACK_ENV'], env['auditing'], ruby_error, :error)
19
+ # end
20
+
21
+ # def log_detail(rack_env, auditor, ruby_error, audit_level)
22
+ # if rack_env == 'development'
23
+ # log_to_location(auditor, "#{ruby_error.message} #{ruby_error.backtrace}", audit_level)
24
+ # else
25
+ # log_to_location(auditor, ruby_error.message, audit_level)
26
+ # end
27
+ # end
28
+
29
+ # def log_to_location(auditor, message, audit_level)
30
+ # return STDERR.puts message if auditor.nil?
31
+ # auditor.send(audit_level, message)
32
+ # end
33
+ # end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+ require 'soar_aspects'
3
+ require './spec/support/auditor'
4
+ require './lib/auditing/middleware'
5
+
6
+ describe "Auditing Middleware" do
7
+ before :each do
8
+ Auditing::Middleware.send(:public, *Auditing::Middleware.private_instance_methods)
9
+
10
+ # Requirements to use
11
+ # 1. Auditor
12
+ configuration = { "preprefix" => "very important:" }
13
+ auditor = SanityAuditor.new
14
+ auditor.configure(configuration)
15
+ auditor.set_audit_level(:error)
16
+
17
+ # 2. Soar Aspects
18
+ SoarAspects::Aspects::auditing = auditor
19
+
20
+ # 3. Some Error Message or Standard Error
21
+ class TestError < StandardError; end
22
+ @error_message = 'Some error'
23
+ @error = TestError.new(@error_message)
24
+
25
+ # or
26
+ @string_error = 'This is a string message not an exception'
27
+
28
+ # or
29
+ @standard_error_message = 'Random Reason'
30
+ @standard_error = StandardError.new(@standard_error_message)
31
+ end
32
+
33
+ context "logging audit information" do
34
+ it 'should use an auditor if configured' do
35
+ exception = set_backtrace
36
+ expect(SoarAspects::Aspects::auditing).to receive(:error).with(exception)
37
+ Auditing::Middleware.error(exception)
38
+ end
39
+
40
+ it 'should print to STDERR if an auditor is not configured' do
41
+ SoarAspects::Aspects::auditing = nil
42
+ expect(STDERR).to receive(:puts).with(@error_message)
43
+ Auditing::Middleware.error(@error_message)
44
+ end
45
+
46
+ it 'should support Exceptions or plain string objects' do
47
+ SoarAspects::Aspects::auditing = nil
48
+ expect(STDERR).to receive(:puts).with(@string_error)
49
+ Auditing::Middleware.error(@string_error)
50
+ end
51
+
52
+ it 'should support error audit level' do
53
+ expect(Auditing::Middleware.respond_to?(:error)).to eq true
54
+ end
55
+
56
+ it 'should support info audit level' do
57
+ expect(Auditing::Middleware.respond_to?(:info)).to eq true
58
+ end
59
+
60
+ it 'should support info audit level' do
61
+ expect(Auditing::Middleware.respond_to?(:warn)).to eq true
62
+ end
63
+
64
+ it 'should support debug audit level' do
65
+ expect(Auditing::Middleware.respond_to?(:debug)).to eq true
66
+ end
67
+
68
+ it 'should support fatal audit level' do
69
+ expect(Auditing::Middleware.respond_to?(:debug)).to eq true
70
+ end
71
+
72
+ end
73
+
74
+ context "error handling" do
75
+ it 'should never raise an exception so as to interfere with middleware processing' do
76
+ allow(Auditing::Middleware).to receive(:log_to_location).and_raise(@standard_error)
77
+ expect{Auditing::Middleware.error(@error)}.to_not raise_error
78
+ end
79
+
80
+ it 'should return an error message' do
81
+ allow(Auditing::Middleware).to receive(:log_to_location).and_raise(@standard_error)
82
+ expect(Auditing::Middleware.error(@error).message).to eq("Unexpected exception: #{@standard_error_message}")
83
+ end
84
+ end
85
+ end
86
+
87
+ def set_backtrace
88
+ @error.set_backtrace(['This is a backtrace', 'Ruby rocks'])
89
+ end
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
@@ -0,0 +1,11 @@
1
+ require 'soar_auditor_api'
2
+
3
+ class SanityAuditor < SoarAuditorApi::AuditorAPI
4
+ def configuration_is_valid?(configuration)
5
+ return configuration.include?("preprefix")
6
+ end
7
+
8
+ def audit(data)
9
+ puts @configuration["preprefix"] + data
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: auditing-middleware
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - daneb
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.5'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 3.5.0
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '3.5'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 3.5.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: rack
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.6'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.6.4
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '1.6'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 1.6.4
81
+ - !ruby/object:Gem::Dependency
82
+ name: byebug
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '9.0'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 9.0.5
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '9.0'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 9.0.5
101
+ - !ruby/object:Gem::Dependency
102
+ name: soar_aspects
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: 0.1.2
108
+ type: :runtime
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: 0.1.2
115
+ - !ruby/object:Gem::Dependency
116
+ name: soar_auditor_api
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: 0.0.12
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: 0.0.12
129
+ description:
130
+ email:
131
+ - dane.balia@hetzner.co.za
132
+ executables: []
133
+ extensions: []
134
+ extra_rdoc_files: []
135
+ files:
136
+ - ".gitignore"
137
+ - ".rspec"
138
+ - Gemfile
139
+ - LICENSE.txt
140
+ - README.md
141
+ - Rakefile
142
+ - auditing-middleware.gemspec
143
+ - lib/auditing/middleware.rb
144
+ - lib/auditing/middleware/version.rb
145
+ - prototype/auditor.rb
146
+ - prototype/config.ru
147
+ - prototype/some_middleware.rb
148
+ - spec/middleware_spec.rb
149
+ - spec/spec_helper.rb
150
+ - spec/support/auditor.rb
151
+ homepage: https://github.com/hetznerZA/auditing_middleware
152
+ licenses:
153
+ - MIT
154
+ metadata: {}
155
+ post_install_message:
156
+ rdoc_options: []
157
+ require_paths:
158
+ - lib
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ requirements: []
170
+ rubyforge_project:
171
+ rubygems_version: 2.4.3
172
+ signing_key:
173
+ specification_version: 4
174
+ summary: Logging trace events in Rack Middleware
175
+ test_files:
176
+ - spec/middleware_spec.rb
177
+ - spec/spec_helper.rb
178
+ - spec/support/auditor.rb