2018-08-02 00:09:29 +02:00
|
|
|
# Copyright (C) 2018 Colin Darie <colin@darie.eu>, 2018 Evolix <info@evolix.fr>
|
|
|
|
# License: GNU AGPL-3+ (see full text in LICENSE file)
|
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
module Whois
|
|
|
|
module Parser
|
2018-06-05 16:42:04 +02:00
|
|
|
class AFNIC < Base
|
2019-02-28 22:33:33 +01:00
|
|
|
# https://www.afnic.fr
|
|
|
|
# Rate limiting : 7200 requests per 24h
|
|
|
|
# cf. https://www.afnic.fr/fr/ressources/documents-de-reference/documents-techniques/documents-techniques-supplementaires-1.html
|
2018-06-05 16:42:04 +02:00
|
|
|
SUPPORTED_TLD = %w[
|
|
|
|
.fr
|
|
|
|
.re
|
|
|
|
.tf
|
|
|
|
.yt
|
|
|
|
.pm
|
|
|
|
.wf
|
|
|
|
].freeze
|
2018-05-30 18:15:20 +02:00
|
|
|
COMMENT_REGEX = /^%+ +(?<text>.+)$/
|
|
|
|
FIELD_REGEX = /^(?<name>[^:]+)\s*:\s+(?<value>.+)$/
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
def self.supports?(domain)
|
|
|
|
SUPPORTED_TLD.include?(tld(domain))
|
|
|
|
end
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
protected
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
def do_parse
|
|
|
|
raise_not_found if comment_include?("No entries found")
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
set_date_format
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
extract_values
|
|
|
|
end
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
private
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
def extract_values
|
|
|
|
domain_index = get_field!("domain", value: domain).index
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
created_date = get_value!("created", after: domain_index)
|
|
|
|
response.created_at = parse_date(created_date)
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
expire_date = get_value!("Expiry Date", after: domain_index)
|
|
|
|
response.expire_at = parse_date(expire_date)
|
|
|
|
|
2019-10-14 13:24:04 +02:00
|
|
|
# Sometimes there is no "last-update" field, so we use the creation date
|
|
|
|
updated_date = get_value("last-update", after: domain_index).presence || created_date
|
2018-05-30 18:15:20 +02:00
|
|
|
response.updated_at = parse_date(updated_date)
|
|
|
|
end
|
|
|
|
|
|
|
|
def parse_date(str)
|
|
|
|
super "#{str} UTC"
|
|
|
|
end
|
2018-05-30 16:48:25 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
def set_date_format
|
|
|
|
afnic_format = get_field!("complete date format").value
|
2018-05-30 12:04:07 +02:00
|
|
|
|
2018-05-30 18:15:20 +02:00
|
|
|
@date_format = "%d/%m/%Y %Z" if afnic_format == "DD/MM/YYYY"
|
|
|
|
end
|
2018-05-30 12:04:07 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|