]> cat aescling's git repositories - mastodon.git/blob - spec/validators/email_mx_validator_spec.rb
Add support for IPv6 only MXes in Email validation (#10009)
[mastodon.git] / spec / validators / email_mx_validator_spec.rb
1 # frozen_string_literal: true
2
3 require 'rails_helper'
4
5 describe EmailMxValidator do
6 describe '#validate' do
7 let(:user) { double(email: 'foo@example.com', errors: double(add: nil)) }
8
9 it 'adds an error if there are no DNS records for the e-mail domain' do
10 resolver = double
11
12 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([])
13 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
14 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
15 allow(resolver).to receive(:timeouts=).and_return(nil)
16 allow(Resolv::DNS).to receive(:open).and_yield(resolver)
17
18 subject.validate(user)
19 expect(user.errors).to have_received(:add)
20 end
21
22 it 'adds an error if a MX record exists but does not lead to an IP' do
23 resolver = double
24
25 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
26 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
27 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
28 allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([])
29 allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
30 allow(resolver).to receive(:timeouts=).and_return(nil)
31 allow(Resolv::DNS).to receive(:open).and_yield(resolver)
32
33 subject.validate(user)
34 expect(user.errors).to have_received(:add)
35 end
36
37 it 'adds an error if the A record is blacklisted' do
38 EmailDomainBlock.create!(domain: '1.2.3.4')
39 resolver = double
40
41 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([])
42 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '1.2.3.4')])
43 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
44 allow(resolver).to receive(:timeouts=).and_return(nil)
45 allow(Resolv::DNS).to receive(:open).and_yield(resolver)
46
47 subject.validate(user)
48 expect(user.errors).to have_received(:add)
49 end
50
51 it 'adds an error if the AAAA record is blacklisted' do
52 EmailDomainBlock.create!(domain: 'fd00::1')
53 resolver = double
54
55 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([])
56 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
57 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::1')])
58 allow(resolver).to receive(:timeouts=).and_return(nil)
59 allow(Resolv::DNS).to receive(:open).and_yield(resolver)
60
61 subject.validate(user)
62 expect(user.errors).to have_received(:add)
63 end
64
65 it 'adds an error if the MX record is blacklisted' do
66 EmailDomainBlock.create!(domain: '2.3.4.5')
67 resolver = double
68
69 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
70 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
71 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
72 allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')])
73 allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
74 allow(resolver).to receive(:timeouts=).and_return(nil)
75 allow(Resolv::DNS).to receive(:open).and_yield(resolver)
76
77 subject.validate(user)
78 expect(user.errors).to have_received(:add)
79 end
80
81 it 'adds an error if the MX IPv6 record is blacklisted' do
82 EmailDomainBlock.create!(domain: 'fd00::2')
83 resolver = double
84
85 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
86 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
87 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
88 allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([])
89 allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::2')])
90 allow(resolver).to receive(:timeouts=).and_return(nil)
91 allow(Resolv::DNS).to receive(:open).and_yield(resolver)
92
93 subject.validate(user)
94 expect(user.errors).to have_received(:add)
95 end
96
97 it 'adds an error if the MX hostname is blacklisted' do
98 EmailDomainBlock.create!(domain: 'mail.example.com')
99 resolver = double
100
101 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
102 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
103 allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
104 allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')])
105 allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::2')])
106 allow(resolver).to receive(:timeouts=).and_return(nil)
107 allow(Resolv::DNS).to receive(:open).and_yield(resolver)
108
109 subject.validate(user)
110 expect(user.errors).to have_received(:add)
111 end
112 end
113 end
This page took 0.123952 seconds and 4 git commands to generate.