mirror of
https://github.com/internetee/registry.git
synced 2025-08-04 17:01:44 +02:00
Merge branch 'master' into refactor-messages
# Conflicts: # db/structure.sql
This commit is contained in:
commit
056c57530c
32 changed files with 730 additions and 148 deletions
51
app/models/concerns/domain/registry_lockable.rb
Normal file
51
app/models/concerns/domain/registry_lockable.rb
Normal file
|
@ -0,0 +1,51 @@
|
|||
module Concerns
|
||||
module Domain
|
||||
module RegistryLockable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
def apply_registry_lock
|
||||
return unless registry_lockable?
|
||||
return if locked_by_registrant?
|
||||
|
||||
transaction do
|
||||
statuses << DomainStatus::SERVER_UPDATE_PROHIBITED
|
||||
statuses << DomainStatus::SERVER_DELETE_PROHIBITED
|
||||
statuses << DomainStatus::SERVER_TRANSFER_PROHIBITED
|
||||
self.locked_by_registrant_at = Time.zone.now
|
||||
|
||||
save!
|
||||
end
|
||||
end
|
||||
|
||||
def registry_lockable?
|
||||
(statuses & [DomainStatus::PENDING_DELETE_CONFIRMATION,
|
||||
DomainStatus::PENDING_CREATE, DomainStatus::PENDING_UPDATE,
|
||||
DomainStatus::PENDING_DELETE, DomainStatus::PENDING_RENEW,
|
||||
DomainStatus::PENDING_TRANSFER, DomainStatus::FORCE_DELETE]).empty?
|
||||
end
|
||||
|
||||
def locked_by_registrant?
|
||||
return false unless locked_by_registrant_at
|
||||
|
||||
lock_statuses = [DomainStatus::SERVER_UPDATE_PROHIBITED,
|
||||
DomainStatus::SERVER_DELETE_PROHIBITED,
|
||||
DomainStatus::SERVER_TRANSFER_PROHIBITED]
|
||||
|
||||
(statuses & lock_statuses).count == 3
|
||||
end
|
||||
|
||||
def remove_registry_lock
|
||||
return unless locked_by_registrant?
|
||||
|
||||
transaction do
|
||||
statuses.delete(DomainStatus::SERVER_UPDATE_PROHIBITED)
|
||||
statuses.delete(DomainStatus::SERVER_DELETE_PROHIBITED)
|
||||
statuses.delete(DomainStatus::SERVER_TRANSFER_PROHIBITED)
|
||||
self.locked_by_registrant_at = nil
|
||||
|
||||
save!
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -37,7 +37,7 @@ module Versions
|
|||
registrar = Registrar.find_by(name: str)
|
||||
user = registrar.api_users.first if registrar
|
||||
|
||||
str_match = str.match(/^(\d+)-(ApiUser:|api-|AdminUser:)/)
|
||||
str_match = str.match(/^(\d+)-(ApiUser:|api-|AdminUser:|RegistrantUser:)/)
|
||||
user ||= User.find_by(id: str_match[1]) if str_match
|
||||
|
||||
user
|
||||
|
|
|
@ -7,6 +7,7 @@ class Domain < ActiveRecord::Base
|
|||
include Concerns::Domain::Discardable
|
||||
include Concerns::Domain::Deletable
|
||||
include Concerns::Domain::Transferable
|
||||
include Concerns::Domain::RegistryLockable
|
||||
|
||||
has_paper_trail class_name: "DomainVersion", meta: { children: :children_log }
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
class RegistrantUser < User
|
||||
ACCEPTED_ISSUER = 'AS Sertifitseerimiskeskus'
|
||||
ACCEPTED_ISSUER = 'AS Sertifitseerimiskeskus'.freeze
|
||||
attr_accessor :idc_data
|
||||
|
||||
devise :database_authenticatable, :trackable, :timeoutable
|
||||
|
@ -10,16 +10,46 @@ class RegistrantUser < User
|
|||
delegate :can?, :cannot?, to: :ability
|
||||
|
||||
def ident
|
||||
registrant_ident.to_s.split("-").last
|
||||
registrant_ident.to_s.split('-').last
|
||||
end
|
||||
|
||||
def country_code
|
||||
registrant_ident.to_s.split('-').first
|
||||
end
|
||||
|
||||
# In Rails 5, can be replaced with a much simpler `or` query method and the raw SQL parts can be
|
||||
# removed.
|
||||
# https://guides.rubyonrails.org/active_record_querying.html#or-conditions
|
||||
def domains
|
||||
ident_cc, ident = registrant_ident.to_s.split '-'
|
||||
Domain.includes(:registrar, :registrant).where(contacts: {
|
||||
ident_type: 'priv',
|
||||
ident: ident, #identity_code,
|
||||
ident_country_code: ident_cc #country_code
|
||||
})
|
||||
domains_where_is_contact = begin
|
||||
Domain.joins(:domain_contacts)
|
||||
.where(domain_contacts: { contact_id: contacts })
|
||||
end
|
||||
|
||||
domains_where_is_registrant = Domain.where(registrant_id: contacts)
|
||||
|
||||
Domain.from(
|
||||
"(#{domains_where_is_registrant.to_sql} UNION " \
|
||||
"#{domains_where_is_contact.to_sql}) AS domains"
|
||||
)
|
||||
end
|
||||
|
||||
def contacts
|
||||
Contact.where(ident_type: 'priv', ident: ident, ident_country_code: country_code)
|
||||
end
|
||||
|
||||
def administered_domains
|
||||
domains_where_is_administrative_contact = begin
|
||||
Domain.joins(:domain_contacts)
|
||||
.where(domain_contacts: { contact_id: contacts, type: [AdminDomainContact] })
|
||||
end
|
||||
|
||||
domains_where_is_registrant = Domain.where(registrant_id: contacts)
|
||||
|
||||
Domain.from(
|
||||
"(#{domains_where_is_registrant.to_sql} UNION " \
|
||||
"#{domains_where_is_administrative_contact.to_sql}) AS domains"
|
||||
)
|
||||
end
|
||||
|
||||
def to_s
|
||||
|
@ -35,13 +65,13 @@ class RegistrantUser < User
|
|||
user_data = {}
|
||||
|
||||
# handling here new and old mode
|
||||
if idc_data.starts_with?("/")
|
||||
if idc_data.starts_with?('/')
|
||||
user_data[:ident] = idc_data.scan(/serialNumber=(\d+)/).flatten.first
|
||||
user_data[:country_code] = idc_data.scan(/^\/C=(.{2})/).flatten.first
|
||||
user_data[:first_name] = idc_data.scan(%r{/GN=(.+)/serialNumber}).flatten.first
|
||||
user_data[:last_name] = idc_data.scan(%r{/SN=(.+)/GN}).flatten.first
|
||||
else
|
||||
parse_str = "," + idc_data
|
||||
parse_str = ',' + idc_data
|
||||
user_data[:ident] = parse_str.scan(/,serialNumber=(\d+)/).flatten.first
|
||||
user_data[:country_code] = parse_str.scan(/,C=(.{2})/).flatten.first
|
||||
user_data[:first_name] = parse_str.scan(/,GN=([^,]+)/).flatten.first
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue