rack-smack 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: caa16a9a96c5b7e93b65202887ad6d85f1208c16
4
+ data.tar.gz: 60f6f861038536c62a39351710c0ee236a29f613
5
+ SHA512:
6
+ metadata.gz: 6e6e8bcff5b2a4684305fb8e39fb2b3cd9824dde306b1b76f19b7e697796ae8d266829c27ec6770cbd2ff4de4a6200b42f9c642d44c6279935e2cc7d1438e903
7
+ data.tar.gz: 5c09bf8cd44898f7537bff1bdcb27fac29c0115dec37a1ba1ffe3fa023bfa1ad43b744f0012e2d4269168bab29ee8c0feb4186a9f22b8b1a5151316aaebc6716
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.txt
11
+ .DS_Store
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.0
5
+ before_install: gem install bundler -v 1.15.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rack-smack.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # Rack::Smack
2
+
3
+ A no-nonsense force of good in a world of bad. Will prevent malicious bots/users from accessing your content once they are caught red-handed.
4
+
5
+ ## Usage
6
+ Require `smack.rb` where you need it and the slide it into your middleware stack:
7
+
8
+ ```
9
+ use Rack::Smack
10
+ ```
11
+
12
+ ## Options
13
+ `file` for filename storing the bad guys
14
+ `list` for the list of keywords you want to ban on
15
+ `asset` for the list of keywords where you want to skip checking
16
+
17
+ ### Example with options
18
+ ```
19
+ use Rack::Smack file: 'bad_guys.txt', list: ['wp', 'wordpress', php', 'admin']
20
+ ```
21
+
22
+ ## Defaults
23
+ |Option|Value|
24
+ |-|-|
25
+ |file|'./ban_list.txt'|
26
+ |list|['wp', 'wordpress', 'xmlrpc', 'sfn']|
27
+ |asset|['css', 'gif', 'jpg', 'jpeg', 'js', 'png', 'ico', 'txt']|
28
+
29
+ ## Want to understand?
30
+ [Code overview](https://alessandrominali.github.io/block_malicious_users_with_rack_app)
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ task default: :test
4
+
5
+ desc 'Run tests'
6
+ task :test do
7
+ sh 'rspec spec/rack/*'
8
+ end
data/lib/rack-smack.rb ADDED
@@ -0,0 +1 @@
1
+ require 'rack/smack'
data/lib/rack/smack.rb ADDED
@@ -0,0 +1,49 @@
1
+ require 'rack/smack/version'
2
+
3
+ module Rack
4
+ # don't cross me boy
5
+ class Smack
6
+ ASSET = %w[css gif jpg jpeg js png ico txt].freeze
7
+ BLOCKED = %w[wp wordpress xmlrpc sfn].freeze
8
+ FILENAME = './ban_list.txt'.freeze
9
+
10
+ def initialize(app, opts = {})
11
+ @app = app
12
+ @asset = opts.delete(:asset) || ASSET
13
+ @blocked = opts.delete(:list) || BLOCKED
14
+ @file = opts.delete(:file) || FILENAME
15
+ raise TypeError unless options_valid?
16
+ IO.write(FILENAME, '') unless ::File.file?(@file)
17
+ end
18
+
19
+ def call(env)
20
+ @req = Rack::Request.new(env)
21
+ return @app.call(env) if @asset.include? @req.path.split('.')[-1]
22
+ return smack if banned?
23
+ return ban! if @blocked.any? { |block| @req.path.index(block) }
24
+ @app.call(env)
25
+ end
26
+
27
+ private
28
+
29
+ def ban!
30
+ IO.write(@file, "#{@req.ip},#{@req.path},#{Time.now}\n", mode: 'a')
31
+ smack
32
+ end
33
+
34
+ def banned?
35
+ IO.foreach(@file) do |row|
36
+ return true if row.split(',')[0] == @req.ip
37
+ end
38
+ false
39
+ end
40
+
41
+ def options_valid?
42
+ @blocked.is_a?(Array) && @asset.is_a?(Array) && @file.is_a?(String)
43
+ end
44
+
45
+ def smack
46
+ [403, { 'Content-Type' => 'text/html' }, ['Banned.']]
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,5 @@
1
+ module Rack
2
+ class Smack
3
+ VERSION = '1.0.0'.freeze
4
+ end
5
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'rack/smack/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'rack-smack'
9
+ spec.version = Rack::Smack::VERSION
10
+ spec.authors = ['AlessandroMinali']
11
+ spec.email = ['alessandro.minali@gmail.com']
12
+
13
+ spec.summary = 'A no-nonsense force of good in a world of bad. Will prevent malicious bots/users from accessing your content once they are caught red-handed.'
14
+ spec.homepage = 'https://github.com/AlessandroMinali/rack-smack'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = 'exe'
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.15'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.2'
27
+ spec.add_development_dependency 'rack-test'
28
+ spec.add_development_dependency 'pry'
29
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-smack
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - AlessandroMinali
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-09-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.15'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.15'
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.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack-test
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description:
84
+ email:
85
+ - alessandro.minali@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".travis.yml"
92
+ - Gemfile
93
+ - LICENSE.txt
94
+ - README.md
95
+ - Rakefile
96
+ - lib/rack-smack.rb
97
+ - lib/rack/smack.rb
98
+ - lib/rack/smack/version.rb
99
+ - rack-smack.gemspec
100
+ homepage: https://github.com/AlessandroMinali/rack-smack
101
+ licenses:
102
+ - MIT
103
+ metadata: {}
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ requirements: []
119
+ rubyforge_project:
120
+ rubygems_version: 2.6.12
121
+ signing_key:
122
+ specification_version: 4
123
+ summary: A no-nonsense force of good in a world of bad. Will prevent malicious bots/users
124
+ from accessing your content once they are caught red-handed.
125
+ test_files: []