diff --git a/app/create.rb b/app/create.rb index c2c8d264..036f3bcf 100644 --- a/app/create.rb +++ b/app/create.rb @@ -84,6 +84,11 @@ post '/create' do return {result: 'error'}.to_json end + if Site.disposable_mx_record?(@site.email) + flash[:error] = 'Cannot use a disposable email address.' + return {result: 'error'}.to_json + end + @site.email_confirmed = true if self.class.development? @site.save diff --git a/models/site.rb b/models/site.rb index d4a9a239..84976098 100644 --- a/models/site.rb +++ b/models/site.rb @@ -546,16 +546,33 @@ class Site < Sequel::Model !username.empty? && username.match(/^[a-zA-Z0-9_\-]+$/i) end + def self.disposable_email_domains + File.readlines(DISPOSABLE_EMAIL_BLACKLIST_PATH).collect {|d| d.strip} + end + + def self.disposable_mx_record?(email) + email_domain = email.match(/@(.+)/).captures.first + + begin + email_mx = Resolv::DNS.new.getresource(email_domain, Resolv::DNS::Resource::IN::MX).exchange.to_s + email_root_domain = email_mx.match(/\.(.+)$/).captures.first + rescue => e + # Guess this is your lucky day. + return false + end + + return true if disposable_email_domains.include? email_root_domain + false + end + def self.disposable_email?(email) return false unless File.exist?(DISPOSABLE_EMAIL_BLACKLIST_PATH) return false if email.blank? email.strip! - disposable_email_domains = File.readlines DISPOSABLE_EMAIL_BLACKLIST_PATH - disposable_email_domains.each do |disposable_email_domain| - return true if email.match /@#{disposable_email_domain.strip}$/i + return true if email.match /@#{disposable_email_domain}$/i end false