1
0
مراية لـ https://github.com/postalserver/postal.git تم المزامنة 2025-12-01 05:43:04 +00:00

initial commit from appmail

هذا الالتزام موجود في:
Adam Cooke
2017-04-19 13:07:25 +01:00
الأصل a3eff53792
التزام 2fdba0ceb5
474 ملفات معدلة مع 51228 إضافات و0 حذوفات

105
app/models/track_domain.rb Normal file
عرض الملف

@@ -0,0 +1,105 @@
# == Schema Information
#
# Table name: track_domains
#
# id :integer not null, primary key
# uuid :string(255)
# server_id :integer
# domain_id :integer
# name :string(255)
# dns_checked_at :datetime
# dns_status :string(255)
# dns_error :string(255)
# created_at :datetime not null
# updated_at :datetime not null
# ssl_enabled :boolean default(TRUE)
# track_clicks :boolean default(TRUE)
# track_loads :boolean default(TRUE)
# excluded_click_domains :text(65535)
#
class TrackDomain < ApplicationRecord
include HasUUID
belongs_to :server
belongs_to :domain
validates :name, :presence => true, :format => {:with => /\A[a-z0-9\-]+\z/}, :uniqueness => {:scope => :domain_id, :message => "is already added"}
validates :domain_id, :uniqueness => {:scope => :server_id, :message => "already has a track domain for this server"}
validate :validate_domain_belongs_to_server
scope :ok, -> { where(:dns_status => 'OK')}
after_create :check_dns
after_create :create_ssl_certificate_if_missing
after_destroy :delete_ssl_certificate_when_not_in_use
before_validation do
self.server = self.domain.server if self.domain && self.server.nil?
end
def full_name
"#{name}.#{domain.name}"
end
def excluded_click_domains_array
@excluded_click_domains_array ||= excluded_click_domains ? excluded_click_domains.split("\n").map(&:strip) : []
end
def dns_ok?
self.dns_status == 'OK'
end
def check_dns
result = self.domain.resolver.getresources(self.full_name, Resolv::DNS::Resource::IN::CNAME)
records = result.map { |r| r.name.to_s.downcase }
if records.empty?
self.dns_status = 'Missing'
self.dns_error = "There is no record at #{self.full_name}"
else
if records.size == 1 && records.first == Postal.config.dns.track_domain
self.dns_status = 'OK'
self.dns_error = nil
else
self.dns_status = 'Invalid'
self.dns_error = "There is a CNAME record at #{self.full_name} but it points to #{records.first} which is incorrect. It should point to #{Postal.config.dns.track_domain}."
end
end
self.dns_checked_at = Time.now
self.save!
dns_ok?
end
def has_ssl?
ssl_certificate && ssl_certificate.active?
end
def use_ssl?
ssl_enabled? && has_ssl?
end
def ssl_certificate
@ssl_certificate ||= TrackCertificate.where(:domain => self.full_name).first
end
def validate_domain_belongs_to_server
if self.domain && ![self.server, self.server.organization].include?(self.domain.owner)
errors.add :domain, "does not belong to the server or the server's organization"
end
end
def create_ssl_certificate_if_missing
unless TrackCertificate.where(:domain => self.full_name).exists?
TrackCertificate.create!(:domain => self.full_name)
end
end
def delete_ssl_certificate_when_not_in_use
others = TrackDomain.includes(:domain).where(:name => self.name, :domains => {:name => self.domain.name})
if others.empty?
TrackCertificate.where(:domain => self.full_name).destroy_all
end
end
end