attacked 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0b04ffb22bcc29d0d939bd2eb5e1c22c605386a9ffce1f2aa59bc919dc1850ae
4
+ data.tar.gz: c6b5e545c137f187130a49edb59c0ab7a07c31402d025f3eba9667ef46b158f4
5
+ SHA512:
6
+ metadata.gz: ae74f489a4fb6a25c7697330ae25f297987fd0824cef1064baf7c632dcf2b8222b6224dc86fc05467b0ca6330e626b065807899d606ce73776c13d6fd7960be0
7
+ data.tar.gz: ab911ef29e7fce5539e3380d867fd77cad9b328dfb1a391b912f968af2357743e6579e91929eeb9cd1c1fa917cf5fe0a39fd2e05fd76172b24a73f96d71f7a91
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2022 Murray Summers
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # Attacked
2
+
3
+ Attacked allows you to manage a list of blocked IP addresses in your Rails application.
4
+ Attacked stores a list of blocked IP addresses in your database and also caches
5
+ these in your Rails cache for fast lookups.
6
+
7
+ Attacked allows you the convenience to block an IP from your admin area or Rails console without deploying your application.
8
+
9
+ You can use Attacked with [rack-attack](https://github.com/rack/rack-attack) to manage a blocklist.
10
+ Attacked caches blocked IP addresses so that there is minimal overhead to your requests.
11
+
12
+ ## Installation
13
+ Add this line to your application's Gemfile:
14
+
15
+ ```ruby
16
+ gem 'attacked'
17
+ ```
18
+
19
+ And then execute:
20
+ ```bash
21
+ $ bundle install
22
+ ```
23
+
24
+ Copy the migrations from attacked to your application:
25
+
26
+ ```bash
27
+ $ bin/rails attacked:install:migrations
28
+ ```
29
+
30
+ Migrate your application:
31
+
32
+ ```bash
33
+ $ bin/rails db:migrate
34
+ ```
35
+
36
+ Install [rack-attack](https://github.com/rack/rack-attack) as usual and setup a blocklist:
37
+
38
+ ```ruby
39
+ # Block attacks from IPs
40
+ # To block an IP: Attacked::BlockedIpAddress.block("1.2.3.4")
41
+ # To unblock an IP: Attacked::BlockedIpAddress.unblock("1.2.3.4")
42
+ blocklist("block ips") do |req|
43
+ Attacked::BlockedIpAddress.blocked?(req.ip)
44
+ end
45
+ ```
46
+
47
+ Please note that `Attacked` defaults to using the `Rails.cache` when caching blocked
48
+ IP addresses. As such you must setup a cache store for your application.
49
+
50
+ ### Usage
51
+
52
+ To block an IP:
53
+
54
+ ```ruby
55
+ Attacked::BlockedIpAddress.block("1.2.3.4")
56
+ ```
57
+
58
+ To unblock an IP:
59
+
60
+ ```ruby
61
+ Attacked::BlockedIpAddress.unblock("1.2.3.4")
62
+ ```
63
+
64
+ To check if an IP is blocked:
65
+
66
+ ```ruby
67
+ Attacked::BlockedIpAddress.blocked?("1.2.3.4")
68
+ ```
69
+
70
+ ## Contributing
71
+ Contribution directions go here.
72
+
73
+ ## License
74
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ load "rails/tasks/statistics.rake"
7
+
8
+ require "bundler/gem_tasks"
9
+
10
+ require "rake/testtask"
11
+
12
+ Rake::TestTask.new(:test) do |t|
13
+ t.libs << 'test'
14
+ t.pattern = 'test/**/*_test.rb'
15
+ t.verbose = false
16
+ end
17
+
18
+ task default: :test
@@ -0,0 +1 @@
1
+ //= link_directory ../stylesheets/attacked .css
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module Attacked
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Attacked
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Attacked
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Attacked
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: 'from@example.com'
4
+ layout 'mailer'
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module Attacked
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,52 @@
1
+ require "resolv"
2
+
3
+ module Attacked
4
+ class BlockedIpAddress < ApplicationRecord
5
+
6
+ after_create :create_in_cache
7
+
8
+ after_destroy :remove_from_cache
9
+
10
+ validates :ip_address, format: {
11
+ with: Regexp.union(Resolv::IPv4::Regex, Resolv::IPv6::Regex)
12
+ }
13
+ validates :ip_address, uniqueness: {
14
+ message: "has already been blocked"
15
+ }
16
+
17
+ def self.blocked?(ip_address)
18
+ Rails.cache.read(blocked_cache_key(ip_address)) ? true : false
19
+ end
20
+
21
+ def self.block(ip_address)
22
+ create ip_address: ip_address
23
+ end
24
+
25
+ def self.unblock(ip_address)
26
+ blocked_ip_address = find_by(ip_address: ip_address)
27
+ blocked_ip_address.unblock
28
+ end
29
+
30
+ def unblock
31
+ destroy
32
+ end
33
+
34
+ private
35
+
36
+ def create_in_cache
37
+ Rails.cache.write(blocked_cache_key(ip_address), true)
38
+ end
39
+
40
+ def remove_from_cache
41
+ Rails.cache.delete(blocked_cache_key(ip_address))
42
+ end
43
+
44
+ def self.blocked_cache_key(ip_address)
45
+ "attacked_blocked_ip #{ip_address}"
46
+ end
47
+
48
+ def blocked_cache_key(ip_address)
49
+ "attacked_blocked_ip #{ip_address}"
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Attacked</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= stylesheet_link_tag "attacked/application", media: "all" %>
9
+ </head>
10
+ <body>
11
+
12
+ <%= yield %>
13
+
14
+ </body>
15
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ Attacked::Engine.routes.draw do
2
+ end
@@ -0,0 +1,9 @@
1
+ class CreateAttackedBlockedIpAddresses < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :attacked_blocked_ip_addresses do |t|
4
+ t.string :ip_address, index: { unique: true }
5
+ t.text :description
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ module Attacked
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Attacked
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Attacked
2
+ VERSION = '0.1.0'
3
+ end
data/lib/attacked.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "attacked/version"
2
+ require "attacked/engine"
3
+
4
+ module Attacked
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :attacked do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: attacked
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Murray Summers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-01-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 5.1.0
27
+ description: Manage a persisted list of blocked IP addresses and block these requests
28
+ email:
29
+ - murray.sum@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - MIT-LICENSE
35
+ - README.md
36
+ - Rakefile
37
+ - app/assets/config/attacked_manifest.js
38
+ - app/assets/stylesheets/attacked/application.css
39
+ - app/controllers/attacked/application_controller.rb
40
+ - app/helpers/attacked/application_helper.rb
41
+ - app/jobs/attacked/application_job.rb
42
+ - app/mailers/attacked/application_mailer.rb
43
+ - app/models/attacked/application_record.rb
44
+ - app/models/attacked/blocked_ip_address.rb
45
+ - app/views/layouts/attacked/application.html.erb
46
+ - config/routes.rb
47
+ - db/migrate/20220104121238_create_attacked_blocked_ip_addresses.rb
48
+ - lib/attacked.rb
49
+ - lib/attacked/engine.rb
50
+ - lib/attacked/version.rb
51
+ - lib/tasks/attacked_tasks.rake
52
+ homepage: https://github.com/murraysum/attacked
53
+ licenses:
54
+ - MIT
55
+ metadata:
56
+ allowed_push_host: https://rubygems.org/
57
+ homepage_uri: https://github.com/murraysum/attacked
58
+ source_code_uri: https://github.com/murraysum/attacked
59
+ changelog_uri: https://github.com/murraysum/attacked
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubygems_version: 3.0.3
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: Manage a persisted list of blocked IP addresses
79
+ test_files: []