antispam 0.1.5 → 0.1.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 278c21161c08ebd08f8376df6ddb57fcda33d20d7ae9e9d804a7b3785c23cbae
4
- data.tar.gz: dab176fb46e3d5ecaa6d2c304262adfc4bf612f413b392270e3b44ef03de7147
3
+ metadata.gz: 636c6cfd1e3a5c84182eaa1e19966e553a2098c4f3a01a049cdbe4613165a52e
4
+ data.tar.gz: 8a53d23ef78da214962bd81411a97a720d5eba3a15817d3f7ccd5bfac81719ec
5
5
  SHA512:
6
- metadata.gz: 3491eb8c49c91b0cc468440cde3b965ac359d6e3d561e8893a5e48079da0441a2128dd9cb118d30b79e147b8ad79d87ce2df78fcd074217880b1c6f9c4e60748
7
- data.tar.gz: b1d49d286f4bc2d6885e40e7f20b0bd9cdec2f57c608dd443b9c060a8a49ca7799e69f05a0e3e5f422071f385a34fcd39e442a2ee5b5a89f0dfd56425574da5c
6
+ metadata.gz: b4d6e23e0432af6b62b7cd9e469c2393a9e4f4513b13d93d282e6841062bd706d70fa44dd6bed0d79658da80ff52827ee8ba9d63baa0a84df2112a7fd313b3dd
7
+ data.tar.gz: 9ca4921062395565e50fa29daf9d56bd3e691b5a675fb34bc4d6ec5e1378da1f3be5b19bdc73294be7fcb55b8e3d766819c140ef45b602d8904818eccf10f187
data/README.md CHANGED
@@ -1,9 +1,29 @@
1
1
  # Antispam
2
2
  The antispam gem helps prevent spam in your Rails applications by
3
- checking against various antispam blacklists on the web.
4
- You can configure which spam blacklists are checked in your application configuration.
3
+ providing tools that check spam against powerful spam-prevention
4
+ databases, accessible for free.
5
5
 
6
- ## Usage
6
+ The first feature checks against an IP database of spam, allowing you
7
+ to stop spammers who are prolific and have been detected on other websites.
8
+ It uses the blazing fast Defendium API to quickly determine if submitted
9
+ content is spam or not.
10
+
11
+ The second feature allows you to submit user-provided content to a spam
12
+ checking service that uses machine learning and a database of content to
13
+ determine whether the user's submitted content is spam.
14
+
15
+ ## Spam Content Checking - Usage
16
+
17
+ ```
18
+ result = Antispam::Checker.check(content: @comment.body)
19
+ if result.is_spam?
20
+ @comment.save
21
+ else
22
+ redirect_to "/access_denied"
23
+ end
24
+ ```
25
+
26
+ ## Bad IP Checking - Usage
7
27
 
8
28
  The gem is used by adding this to your ApplicationController.rb
9
29
 
@@ -13,8 +33,18 @@ before_action do
13
33
  end
14
34
  ```
15
35
 
36
+ Codes are from the [httpbl](https://www.projecthoneypot.org/httpbl.php) at projecthoneypot.org
37
+
16
38
  Once the filter is setup, everything else is handled for your application.
17
- The gem will run during any request that is not a GET request.
39
+ By default the gem will run during any request that is not a GET request.
40
+
41
+ You can change the filter to run during other requests.
42
+
43
+ ```
44
+ before_action do
45
+ check_ip_against_database(ip_blacklists: {default: 'yourcodehere'}, methods: [:get,:post,:put,:patch,:delete])
46
+ end
47
+ ```
18
48
 
19
49
  Blacklist database lookups are cached for 24 hours, and cached results won't need
20
50
  to slowdown your app by additional http requests on the backend.
@@ -27,7 +57,7 @@ You need to add this to your routes.rb
27
57
  mount Antispam::Engine => "/antispam"
28
58
  ```
29
59
  You can see what IP addresses have been blocked by going to /antispam/blocks
30
- but your applicationcontroller must respond to ```is_admin?``` function.
60
+ but your ApplicationController.rb must respond to ```is_admin?``` function.
31
61
 
32
62
 
33
63
  ## Installation
@@ -70,3 +100,14 @@ The gem is available as open source under the terms of the [MIT License](https:/
70
100
  ## Code of Conduct
71
101
 
72
102
  Everyone interacting in the Antispam project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/ryankopf/antispam/blob/master/CODE_OF_CONDUCT.md).
103
+
104
+ ## NO WARRANTY
105
+
106
+ THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY KIND,
107
+ EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO,
108
+ ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO SPECIFICATIONS,
109
+ ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
110
+ OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL BE
111
+ ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, WILL CONFORM TO
112
+ THE SUBJECT SOFTWARE. THIS SOFTWARE IS PROVIDED "AS IS." IF YOUR JURISDICTION
113
+ DOES NOT ALLOW THESE LIMITATIONS THEN YOU MAY NOT USE THE SOFTWARE.
@@ -17,6 +17,7 @@ module Antispam
17
17
  # GET /challenges/new
18
18
  def new
19
19
  # use in the future for changing code
20
+ head :ok
20
21
  end
21
22
 
22
23
  # PATCH/PUT /challenges/1
@@ -34,6 +34,6 @@
34
34
  </table>
35
35
  </div>
36
36
  <div class="cx">
37
- <%= render template: '/antispam/clears/index.html' %>
37
+ <%= render template: '/antispam/clears/index', formats: :html %>
38
38
  </div>
39
39
  </div>
@@ -15,19 +15,20 @@ module Antispam
15
15
  address = Resolv::getaddress(host)
16
16
  z,days,threat,iptype = address.split('.')
17
17
  Rails.logger.info "Spam located: #{iptype} type at #{threat} threat. (#{ip} - #{address})" if verbose
18
+ threat = threat.to_i
18
19
  # Create or update
19
- if (threat.to_i > 30)
20
- Rails.logger.info "Spamcheck: Very high, over 30!"
20
+ if (threat > 30)
21
+ Rails.logger.info "Spamcheck: Very high, over 30!" if verbose
21
22
  end
22
23
  rescue Exception => e
23
24
  case e
24
25
  when Resolv::ResolvError #Not spam! This blacklist gives an error when there's no spam threat.
25
- Rails.logger.info "Spamcheck: OK! Resolve error means the httpbl does not consider this spam."
26
+ Rails.logger.info "Spamcheck: OK! Resolve error means the httpbl does not consider this spam." if verbose
26
27
  when Interrupt #Something broke while trying to check blacklist.
27
- Rails.logger.info "Spamcheck: Interrupt when trying to resolve http blacklist. Possible timeout?"
28
+ Rails.logger.info "Spamcheck: Interrupt when trying to resolve http blacklist. Possible timeout?" if verbose
28
29
  else # Time Out
29
- Rails.logger.info "Spamcheck: There was an error, possibly a time out, when checking this IP."
30
- Rails.logger.info e.to_s
30
+ Rails.logger.info "Spamcheck: There was an error, possibly a time out, when checking this IP." if verbose
31
+ Rails.logger.info e.to_s if verbose
31
32
  end
32
33
  end
33
34
  update_old_result(ip, threat)
@@ -0,0 +1,20 @@
1
+ module Antispam
2
+ module Checker
3
+ # Checks content for spam
4
+ # check(options, spamcheck_providers)
5
+ # Usage: check({content: "No spam here"}, {defendium: 'MY_API_KEY'}})
6
+ def self.check(options = {}, spamcheck_providers = {defendium: 'YOUR_KEY'})
7
+ Rails.logger.info "Content was nil for spamcheck." if options[:content].nil? && options[:verbose]
8
+ return if options[:content].nil?
9
+ Rails.logger.info "Spamcheckers should be a hash" if (!(options[:spamcheck_providers].is_a? Hash)) && options[:verbose]
10
+ results = []
11
+ spamcheck_providers.each do |spamchecker_name, spamchecker_api_key|
12
+ if spamchecker_name == :defendium
13
+ results.append Antispam::Spamcheckers::Defendium.check(options[:content], spamchecker_api_key, options[:verbose])
14
+ end
15
+ end
16
+ result = Antispam::SpamcheckResult.new(results)
17
+ return result
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,10 @@
1
+ module Antispam
2
+ class SpamcheckResult
3
+ def initialize(results)
4
+ @results = results
5
+ end
6
+ def is_spam?
7
+ @results.select{|x| x > 0}.present?
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,29 @@
1
+ #require 'resolv'
2
+ module Antispam
3
+ module Spamcheckers
4
+ class Defendium
5
+ def self.check(content, key, verbose)
6
+ # nethttp2.rb
7
+ require 'uri'
8
+ require 'net/http'
9
+
10
+ uri = URI('https://api.defendium.com/check')
11
+ params = { secret_key: key, content: content }
12
+ uri.query = URI.encode_www_form(params)
13
+
14
+ res = Net::HTTP.get_response(uri)
15
+ if res.is_a?(Net::HTTPSuccess)
16
+ result = res.body.to_json
17
+ if result["warnings"]
18
+ Rails.logger.info result["warnings"]
19
+ end
20
+ if result["result"]
21
+ return 1
22
+ else
23
+ return 0
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,6 +1,7 @@
1
1
  module Antispam
2
2
  module Tools
3
- # before_action :check_ip_against_database
3
+ # Checks spam against an IP database of spammers.
4
+ # Usage: before_action :check_ip_against_database
4
5
  def check_ip_against_database(options = {ip_blacklists: {default: ''}})
5
6
  if (options[:methods])
6
7
  return if request.get? unless options[:methods].include?(:get)
@@ -28,9 +29,10 @@ module Antispam
28
29
  end
29
30
  Rails.logger.info "Completed IP database check. #{ip}" if options[:verbose]
30
31
  end
32
+ # Checks the specific blacklists
31
33
  def check_ip_against_blacklists(ip, lists, verbose)
32
34
  lists.each do |provider_name, provider_api_key|
33
- puts "Checking provider: #{provider_name}" if verbose
35
+ Rails.logger.info "Checking provider: #{provider_name}" if verbose
34
36
  if provider_name == :httpbl
35
37
  result = Antispam::Blacklists::Httpbl.check(ip, provider_api_key, verbose)
36
38
  Rails.logger.info(result) if verbose
@@ -1,3 +1,3 @@
1
1
  module Antispam
2
- VERSION = '0.1.5'
2
+ VERSION = '0.1.7'
3
3
  end
data/lib/antispam.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  require "antispam/version"
2
2
  require "antispam/engine"
3
3
  require "antispam/tools"
4
+ require "antispam/checker"
4
5
  require "antispam/blacklists/httpbl"
6
+ require "antispam/spamcheckers/defendium"
7
+ require "antispam/results"
5
8
 
6
9
  module Antispam
7
10
  ActiveSupport.on_load(:action_controller) do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: antispam
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Kopf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-26 00:00:00.000000000 Z
11
+ date: 2023-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 6.0.0
19
+ version: 6.1.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 6.0.0
26
+ version: 6.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: image_processing
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: net-http
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'
41
55
  description: Antispam checks DNS blacklists and helps prevent spam on your site.
42
56
  email:
43
57
  - antispam@ryankopf.com
@@ -102,7 +116,10 @@ files:
102
116
  - db/migrate/20210131165122_add_threat_to_antispam_blocks.rb
103
117
  - lib/antispam.rb
104
118
  - lib/antispam/blacklists/httpbl.rb
119
+ - lib/antispam/checker.rb
105
120
  - lib/antispam/engine.rb
121
+ - lib/antispam/results.rb
122
+ - lib/antispam/spamcheckers/defendium.rb
106
123
  - lib/antispam/tools.rb
107
124
  - lib/antispam/version.rb
108
125
  - lib/tasks/antispam_tasks.rake
@@ -129,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
146
  - !ruby/object:Gem::Version
130
147
  version: '0'
131
148
  requirements: []
132
- rubygems_version: 3.1.4
149
+ rubygems_version: 3.4.4
133
150
  signing_key:
134
151
  specification_version: 4
135
152
  summary: A spam prevention gem.