mailshield 1.2 → 1.4

Sign up to get free protection for your applications and to get access to all the features.
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: []