mailshield 1.2 → 1.4

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: 47694cab766631dd24097db7e130aeac98bbc12f2ad4aef7a5f065811796ea71
4
- data.tar.gz: 52d6019eb905e12d7d4e5d6eee0cae2c36fba7e301a5e897c3350fa26aeb632f
3
+ metadata.gz: 4a63f4492f21b558750b2e876a02ccdad172bc8e471cacf533e6886d348e0b5a
4
+ data.tar.gz: d83751d2286c3b034a92cf4e65b55cdebd68fb7d31fb0ac7cc12489258e1544f
5
5
  SHA512:
6
- metadata.gz: 41ec5aa1ae5db31d9e0e437eac3dc85da10561cecc9c1b57fe793fccda7990f7a707695c4f794c0518ed2fb23c99767daa18a7cca8488e7792b939e5a71d432e
7
- data.tar.gz: 887fe66ea4b30711689cea1346c9466d326cb13c927b6e957c6d6d035ef908f0a5739751f27e6af17c4dbdb3d6df9d5bca4bf89087064fbc3d2427f8ce4a717b
6
+ metadata.gz: a3317ff62aa8479a9f678c01024c99da25e230d9ecfc59013ca0579e05d43eec6e1bc55978b73dfee4b2bb91211c6f88aa248c58b0b0e3a24a5aa90f0be4faec
7
+ data.tar.gz: 71fca0b12c55c64a24d55ea532427b9eb4e68d4cafae91872a423d6f4e38eb6d8c7e2e895911daf2bcc2811eeaa4e7adbf49bbf2c6559c4e7e6f0be506744d97
@@ -87,8 +87,8 @@ module MailShield
87
87
 
88
88
 
89
89
  class << self
90
- def disposable_domain?(domain)
91
- KNOWN_DISPOSABLE_DOMAINS.include?(domain)
90
+ def validate_known_disposal_domain?(domain)
91
+ raise TemporaryDomainError, 'Temporary / Disposal Email.' if KNOWN_DISPOSABLE_DOMAINS.include?(domain)
92
92
  end
93
93
  end
94
94
  end
@@ -12,7 +12,7 @@ module MailShield
12
12
 
13
13
  return if result[:valid]
14
14
 
15
- record.errors.add(:email, result[:issue])
15
+ record.errors.add(:base, result[:reason])
16
16
  end
17
17
  end
18
18
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mailshield
4
- VERSION = '1.2'
5
- end
4
+ VERSION = '1.4'
5
+ end
data/lib/mailshield.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'mailshield/version'
4
4
  require_relative 'mailshield/disposable_domains'
5
+ require 'mailshield/secure_email_validator'
5
6
  require 'resolv'
6
7
  require 'csv'
7
8
  require 'net/smtp'
@@ -15,7 +16,7 @@ module MailShield
15
16
  class SPFError < ValidationError; end
16
17
  class DMARCError < ValidationError; end
17
18
  class SMTPError < ValidationError; end
18
-
19
+ class TemporaryDomainError < ValidationError; end
19
20
  class << self
20
21
  attr_accessor :dns_cache, :smtp_cache
21
22
 
@@ -25,13 +26,15 @@ module MailShield
25
26
  domain = extract_domain(email)
26
27
 
27
28
  begin
29
+ validate_known_disposal_domain?(domain)
28
30
  validate_format!(email)
29
31
  validate_domain!(domain)
30
32
  validate_spf!(domain)
31
33
  validate_dmarc!(domain)
32
34
  validate_smtp!(email) if verify_by_send
35
+
33
36
  rescue ValidationError => e
34
- return { valid: false, issues: [e.message] }
37
+ return { valid: false, reason: e.message }
35
38
  end
36
39
 
37
40
  { valid: true }
@@ -57,15 +60,15 @@ module MailShield
57
60
  end
58
61
 
59
62
  def validate_spf!(domain)
60
- raise SPFError, 'Temporary / Disposable Email' unless spf_record?(domain)
63
+ raise SPFError, 'Temporary / Disposable Email.' unless spf_record?(domain)
61
64
  end
62
65
 
63
66
  def validate_dmarc!(domain)
64
- raise DMARCError, 'Temporary / Disposable Email' unless dmarc_record?(domain)
67
+ raise DMARCError, 'Temporary / Disposable Email.' unless dmarc_record?(domain)
65
68
  end
66
69
 
67
70
  def validate_smtp!(email)
68
- raise SMTPError, 'Email Address Not Found' unless smtp_verify_email(email)
71
+ raise SMTPError, 'Email Address Not Found.' unless smtp_verify_email(email)
69
72
  end
70
73
 
71
74
  def extract_domain(email)
@@ -77,13 +80,11 @@ module MailShield
77
80
  end
78
81
 
79
82
  def fetch_mx_records(domain)
80
- dns_cache[domain] ||= begin
81
- Resolv::DNS.open do |dns|
82
- dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
83
- end
84
- rescue Resolv::ResolvError
85
- []
83
+ Resolv::DNS.open do |dns|
84
+ dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
86
85
  end
86
+ rescue Resolv::ResolvError
87
+ []
87
88
  end
88
89
 
89
90
  def spf_record?(domain)
@@ -97,18 +98,17 @@ module MailShield
97
98
  end
98
99
 
99
100
  def fetch_txt_records(domain)
100
- dns_cache[domain] ||= begin
101
- Resolv::DNS.open do |dns|
102
- dns.getresources(domain, Resolv::DNS::Resource::IN::TXT).map(&:data)
103
- end
104
- rescue Resolv::ResolvError
105
- []
101
+ Resolv::DNS.open do |dns|
102
+ records = dns.getresources(domain, Resolv::DNS::Resource::IN::TXT)
103
+ records.map(&:data)
106
104
  end
105
+ rescue Resolv::ResolvError
106
+ []
107
107
  end
108
108
 
109
109
  def smtp_verify_email(email)
110
110
  domain = extract_domain(email)
111
- smtp_server = smtp_cache[domain] ||= get_smtp_server(domain)
111
+ smtp_server = get_smtp_server(domain)
112
112
 
113
113
  return false unless smtp_server
114
114
 
@@ -117,7 +117,7 @@ module MailShield
117
117
  smtp.helo('localhost')
118
118
  smtp.mailfrom('test@example.com')
119
119
  response = smtp.rcptto(email)
120
- response == '250 OK'
120
+ response.status == '250' || response.status == '250 OK'
121
121
  end
122
122
  rescue Net::SMTPFatalError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Errno::ECONNREFUSED
123
123
  false
@@ -130,3 +130,13 @@ module MailShield
130
130
  end
131
131
  end
132
132
  end
133
+
134
+ module ActiveModel
135
+ module Validations
136
+ class SecureEmailValidator < ::MailShield::SecureEmailValidator
137
+ def initialize(options = {})
138
+ super
139
+ end
140
+ end
141
+ end
142
+ end
metadata CHANGED
@@ -1,17 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailshield
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.2'
4
+ version: '1.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - jana
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-03 00:00:00.000000000 Z
12
- dependencies: []
13
- description: MailShield helps secure your application by identifying temporary or
14
- disposable email domains.
11
+ date: 2024-09-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: net-smtp
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.2.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.2.1
27
+ description: MailShield enhances your app’s security by blocking temporary, spam and
28
+ disposable email addresses, keeping your user data clean and reducing spam.
15
29
  email:
16
30
  - shanmugamjanarthan24@gmail.com
17
31
  executables: []