From 2bfaefcbd4dfabf4e2ba4747997abba822a54de5 Mon Sep 17 00:00:00 2001 From: henning mueller Date: Tue, 24 Jun 2014 10:31:09 +0200 Subject: [PATCH 1/2] Updated gems. --- Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0a60a1e..c7f828e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -107,7 +107,7 @@ GEM warden (~> 1.2.3) devise-encryptable (0.2.0) devise (>= 2.1.0) - docile (1.1.3) + docile (1.1.5) elasticsearch (0.4.11) elasticsearch-api (= 0.4.11) elasticsearch-transport (= 0.4.11) @@ -146,12 +146,12 @@ GEM jdbc-postgres (9.3.1101) jdbc-sqlite3 (3.7.2.1) journey (1.0.4) - jquery-rails (3.1.0) + jquery-rails (3.1.1) railties (>= 3.0, < 5.0) thor (>= 0.14, < 2.0) json (1.8.1) json (1.8.1-java) - kaminari (0.15.1) + kaminari (0.16.1) actionpack (>= 3.0.0) activesupport (>= 3.0.0) libv8 (3.16.14.3) @@ -219,7 +219,7 @@ GEM railties (~> 3.2.0) sass (>= 3.1.10) tilt (~> 1.3) - searchkick (0.7.6) + searchkick (0.7.8) activemodel elasticsearch (~> 0.4.11) hashie @@ -270,7 +270,7 @@ GEM polyglot polyglot (>= 0.3.1) tzinfo (0.3.39) - uglifier (2.5.0) + uglifier (2.5.1) execjs (>= 0.3.0) json (>= 1.8.0) warden (1.2.3) From 9f8c6b9d9933f34d006655643c27a79e98b82da6 Mon Sep 17 00:00:00 2001 From: henning mueller Date: Tue, 1 Jul 2014 15:07:18 +0200 Subject: [PATCH 2/2] Check if MX records of domains are set to managed mail server. --- app/controllers/admin/domains_controller.rb | 6 +++++ app/models/domain.rb | 8 ++++++- app/views/admin/domains/_domain.html.haml | 3 +++ app/views/admin/domains/index.html.haml | 11 ++++++++- config/routes.rb | 1 + config/settings.yml | 2 ++ .../20140701123952_add_mx_set_to_domain.rb | 5 ++++ db/schema.rb | 3 ++- lib/resolve.rb | 23 +++++++++++++++++++ 9 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20140701123952_add_mx_set_to_domain.rb create mode 100644 lib/resolve.rb diff --git a/app/controllers/admin/domains_controller.rb b/app/controllers/admin/domains_controller.rb index f263659..396f85e 100644 --- a/app/controllers/admin/domains_controller.rb +++ b/app/controllers/admin/domains_controller.rb @@ -6,6 +6,12 @@ class Admin::DomainsController < AdminController actions :all, except: [:show, :index] + # Check if MX records on all managable Domains and redirect to index. + def check_mx_records + Domain.managable(current_mailbox).all.map(&:update_mx_set!) + redirect_to [:admin, :domains] + end + # Create Domain and redirect to index. def create super do |success, error| diff --git a/app/models/domain.rb b/app/models/domain.rb index 1f7202a..b1fb3c0 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -18,7 +18,7 @@ class Domain < ActiveRecord::Base before_save -> { name.downcase! } - has_paper_trail + has_paper_trail ignore: :mx_set searchkick word_middle: [:name, :description] # Search fields options includable in search on model. @@ -66,6 +66,12 @@ def mailboxes_for_select mailboxes.map { |m| [m.email, m.id] } end + # Check if MX of Domain is set to default MX for Møil instance. + def update_mx_set! + self.mx_set = (Resolve.address(Resolve.mx(self)) == Resolve.address(Settings.mx_check_domain)) + save! + end + # String representation. def to_s name diff --git a/app/views/admin/domains/_domain.html.haml b/app/views/admin/domains/_domain.html.haml index a838b9c..8bfb6dd 100644 --- a/app/views/admin/domains/_domain.html.haml +++ b/app/views/admin/domains/_domain.html.haml @@ -4,6 +4,9 @@ %td= link_to domain.aliases.count, [:admin, domain, :aliases] %td= link_to domain.permissions.count, [:admin, domain, :permissions] %td= link_to_alias_or_mailbox domain.catch_all_address + %td + - unless domain.mx_set? + %span.label.label-warning no %td - if can? :destroy, domain = link_to [:admin, domain], method: :delete, confirm: 'Are you really sure? This will delete all mailboxes and aliases of this domain, too.', class: 'btn btn-danger btn-xs' do diff --git a/app/views/admin/domains/index.html.haml b/app/views/admin/domains/index.html.haml index cad5d8c..8848ee4 100644 --- a/app/views/admin/domains/index.html.haml +++ b/app/views/admin/domains/index.html.haml @@ -1,7 +1,15 @@ .page-header %h1 Domains - if can? :create, :domain - = link_to_create new_admin_domain_path + .btn-toolbar + .btn-group + = link_to_create [:new, :admin, :domain] + %button.btn.btn-default.dropdown-toggle{data: {toggle: 'dropdown'}} + Actions + %span.caret + %ul.dropdown-menu{role: 'menu'} + %li + = link_to 'Check MX records', [:check_mx_records, :admin, :domains], method: :post %p Got @@ -20,6 +28,7 @@ = icon :certificate Permissions %th Catch-All + %th MX? %th %tbody = render collection.all diff --git a/config/routes.rb b/config/routes.rb index 83dc714..c144baf 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,6 +9,7 @@ resources :aliases, except: :show resources :mailboxes, except: :show resources :permissions, except: :show + post 'check_mx_records', on: :collection end resources :versions, only: :index do get 'updates', on: :collection diff --git a/config/settings.yml b/config/settings.yml index 85a4488..c9f927e 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -11,3 +11,5 @@ blocked_usernames: elasticsearch: true spam_alias_username_length: 6 + +mx_check_domain: mx.orgizm.net diff --git a/db/migrate/20140701123952_add_mx_set_to_domain.rb b/db/migrate/20140701123952_add_mx_set_to_domain.rb new file mode 100644 index 0000000..51b80be --- /dev/null +++ b/db/migrate/20140701123952_add_mx_set_to_domain.rb @@ -0,0 +1,5 @@ +class AddMxSetToDomain < ActiveRecord::Migration + def change + add_column :domains, :mx_set, :boolean, default: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 296925b..51e2cee 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20140203233345) do +ActiveRecord::Schema.define(:version => 20140701123952) do create_table "aliases", :force => true do |t| t.string "username" @@ -34,6 +34,7 @@ t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.boolean "quick_access", :default => true + t.boolean "mx_set", :default => true end add_index "domains", ["name"], :name => "index_domains_on_name", :unique => true diff --git a/lib/resolve.rb b/lib/resolve.rb new file mode 100644 index 0000000..710d524 --- /dev/null +++ b/lib/resolve.rb @@ -0,0 +1,23 @@ +require 'resolv' + +# Make resolving DNS records a little more handy. +module Resolve + # Resolves A or AAAA record. + def self.address(domain) + Resolv::DNS.new + .getaddress(domain.to_s) + .to_s + rescue Resolv::ResolvError + nil + end + + # Resolves MX record. + def self.mx(domain) + Resolv::DNS.new + .getresource(domain.to_s, Resolv::DNS::Resource::IN::MX) + .exchange + .to_s + rescue Resolv::ResolvError + nil + end +end