def get(self): """ Return the referer aka the WHOIS server of the current domain extension. """ if not PyFunceble.CONFIGURATION["local"]: # We are not running a test in a local network. if self.domain_extension not in self.ignored_extension: # The extension of the domain we are testing is not into # the list of ignored extensions. # We set the referer to None as we do not have any. referer = None if self.domain_extension in PyFunceble.INTERN["iana_db"]: # The domain extension is in the iana database. if not PyFunceble.CONFIGURATION["no_whois"]: # We are authorized to use WHOIS for the test result. # We get the referer from the database. referer = PyFunceble.INTERN["iana_db"][self.domain_extension] if not referer: # The referer is not filled. # We log the case of the current extension. Logs().referer_not_found(self.domain_extension) # And we handle and return the down status. return Status( PyFunceble.STATUS["official"]["down"] ).handle() # The referer is into the database. # We return the extracted referer. return referer # We are not authorized to use WHOIS for the test result. # We return None. return None # The domain extension is not in the iana database. # We hanlde and return the invalid status. return Status(PyFunceble.STATUS["official"]["invalid"]).handle() # The extension of the domain we are testing is not into # the list of ignored extensions. # We handle and return the down status. return Status(PyFunceble.STATUS["official"]["down"]).handle() # We are running a test in a local network. # We return None. return None
def __extract_from_record(self): # pragma: no cover """ Extract the expiration date from the whois record. """ if self.whois_record: # The whois record is not empty. for string in self.expiration_patterns: # We loop through the list of regex. # We try tro extract the expiration date from the WHOIS record. expiration_date = Regex( self.whois_record, string, return_data=True, rematch=True, group=0 ).match() if expiration_date: # The expiration date could be extracted. # We get the extracted expiration date. self.expiration_date = expiration_date[0].strip() # We initate a regex which will help us know if a number # is present into the extracted expiration date. regex_rumbers = r"[0-9]" if Regex( self.expiration_date, regex_rumbers, return_data=False ).match(): # The extracted expiration date has a number. # We format the extracted expiration date. self.expiration_date = self._format() if ( self.expiration_date and not Regex( self.expiration_date, r"[0-9]{2}\-[a-z]{3}\-2[0-9]{3}", return_data=False, ).match() ): # The formatted expiration date does not match our unified format. # We log the problem. Logs().expiration_date(self.subject, self.expiration_date) # We save the whois record into the database. self.whois_db.add( self.subject, self.expiration_date, self.whois_record )
def get(self): # pragma: no cover """ Execute the logic behind the meaning of ExpirationDate + return the matched status. :return: (expiration date, whois record) :rtype: tuple """ if self.whois_server: # The whois server is given. # We try to extract the expiration date from the WHOIS record. # And we return the matched status. self._extract() # We log our whois record if the debug mode is activated. Logs().whois(self.subject, self.whois_record) # And we return the expiration date and the whois record. return self.expiration_date, self.whois_record
def get(self): # pragma: no cover """ Execute the logic behind the meaning of ExpirationDate + return the matched status. :return: The status of the tested domain. Can be one of the official status. :rtype: str """ # We get the status of the domain validation. domain_validation = Check().is_domain_valid() # We get the status of the IPv4 validation. ip_validation = Check().is_ip_valid() if "current_test_data" in PyFunceble.INTERN: # The end-user want more information whith his test. # We update some index. PyFunceble.INTERN["current_test_data"].update({ "domain_syntax_validation": domain_validation, "ip4_syntax_validation": ip_validation, }) if (domain_validation and not ip_validation or domain_validation or PyFunceble.CONFIGURATION["local"]): # * The element is a valid domain. # and # * The element is not ahe valid IPv4. # or # * The element is a valid domain. # * We get the HTTP status code of the currently tested element. # and # * We try to get the element status from the IANA database. PyFunceble.INTERN.update({ "http_code": HTTPCode().get(), "referer": Referer().get() }) if PyFunceble.INTERN["referer"] in [ PyFunceble.STATUS["official"]["up"], PyFunceble.STATUS["official"]["down"], PyFunceble.STATUS["official"]["invalid"], ]: # The WHOIS record status is into our list of official status. # We consider that status as the status of the tested element. return PyFunceble.INTERN["referer"] # The WHOIS record status is not into our list of official status. if "current_test_data" in PyFunceble.INTERN: # The end-user want more information whith his test. # We update the whois_server index. PyFunceble.INTERN["current_test_data"][ "whois_server"] = PyFunceble.INTERN["referer"] if PyFunceble.INTERN["referer"] and not Check().is_subdomain(): # * The iana database comparison status is not None. # and # * The domain we are testing is not a subdomain. # We try to extract the expiration date from the WHOIS record. # And we return the matched status. return self._extract() # The iana database comparison status is None. # We log our whois record if the debug mode is activated. Logs().whois(self.whois_record) # And we return and handle the official down status. return Status(PyFunceble.STATUS["official"]["down"]).handle() if (ip_validation and not domain_validation or ip_validation or PyFunceble.CONFIGURATION["local"]): # * The element is a valid IPv4. # and # * The element is not a valid domain. # or # * The element is a valid IPv4. # We get the HTTP status code. PyFunceble.INTERN["http_code"] = HTTPCode().get() # We log our whois record if the debug mode is activated. Logs().whois(self.whois_record) # And we return and handle the official down status. return Status(PyFunceble.STATUS["official"]["down"]).handle() # The validation was not passed. # We log our whois record if the debug mode is activated. Logs().whois(self.whois_record) # And we return and handle the official invalid status. return Status(PyFunceble.STATUS["official"]["invalid"], "SYNTAX").handle()
def _extract(self): # pragma: no cover """ Extract the expiration date from the whois record. :return: The status of the domain. :rtype: str """ # We try to get the expiration date from the database. expiration_date_from_database = Whois().get_expiration_date() if expiration_date_from_database: # The hash of the current whois record did not changed and the # expiration date from the database is not empty not equal to # None or False. # We generate the files and print the status. # It's an active element! Generate( PyFunceble.STATUS["official"]["up"], "WHOIS", expiration_date_from_database, ).status_file() # We handle und return the official up status. return PyFunceble.STATUS["official"]["up"] # We get the whois record. self.whois_record = Lookup().whois(PyFunceble.INTERN["referer"]) # We list the list of regex which will help us get an unformatted expiration date. to_match = [ r"expire:(.*)", r"expire on:(.*)", r"Expiry Date:(.*)", r"free-date(.*)", r"expires:(.*)", r"Expiration date:(.*)", r"Expiry date:(.*)", r"Expire Date:(.*)", r"renewal date:(.*)", r"Expires:(.*)", r"validity:(.*)", r"Expiration Date :(.*)", r"Expiry :(.*)", r"expires at:(.*)", r"domain_datebilleduntil:(.*)", r"Data de expiração \/ Expiration Date \(dd\/mm\/yyyy\):(.*)", r"Fecha de expiración \(Expiration date\):(.*)", r"\[Expires on\](.*)", r"Record expires on(.*)(\(YYYY-MM-DD\))", r"status: OK-UNTIL(.*)", r"renewal:(.*)", r"expires............:(.*)", r"expire-date:(.*)", r"Exp date:(.*)", r"Valid-date(.*)", r"Expires On:(.*)", r"Fecha de vencimiento:(.*)", r"Expiration:.........(.*)", r"Fecha de Vencimiento:(.*)", r"Registry Expiry Date:(.*)", r"Expires on..............:(.*)", r"Expiration Time:(.*)", r"Expiration Date:(.*)", r"Expired:(.*)", r"Date d'expiration:(.*)", ] if self.whois_record: # The whois record is not empty. if "current_test_data" in PyFunceble.INTERN: # The end-user want more information whith his test. # We update the whois_record index. PyFunceble.INTERN["current_test_data"][ "whois_record"] = self.whois_record for string in to_match: # We loop through the list of regex. # We try tro extract the expiration date from the WHOIS record. expiration_date = Regex(self.whois_record, string, return_data=True, rematch=True, group=0).match() if expiration_date: # The expiration date could be extracted. # We get the extracted expiration date. self.expiration_date = expiration_date[0].strip() # We initate a regex which will help us know if a number # is present into the extracted expiration date. regex_rumbers = r"[0-9]" if Regex(self.expiration_date, regex_rumbers, return_data=False).match(): # The extracted expiration date has a number. # We format the extracted expiration date. self.expiration_date = self._format() if (self.expiration_date and not Regex( self.expiration_date, r"[0-9]{2}\-[a-z]{3}\-2[0-9]{3}", return_data=False, ).match()): # The formatted expiration date does not match our unified format. # We log the problem. Logs().expiration_date(self.expiration_date) # We log the whois record. Logs().whois(self.whois_record) if "current_test_data" in PyFunceble.INTERN: # The end-user want more information whith his test. # We update the expiration_date index. PyFunceble.INTERN["current_test_data"][ "expiration_date"] = self.expiration_date # We generate the files and print the status. # It's an active element! Generate( PyFunceble.STATUS["official"]["up"], "WHOIS", self.expiration_date, ).status_file() # We log the whois record. Logs().whois(self.whois_record) # We save the whois record into the database. Whois(expiration_date=self.expiration_date).add() # We handle und return the official up status. return PyFunceble.STATUS["official"]["up"] # The extracted expiration date does not have a number. # We log the whois record. Logs().whois(self.whois_record) # We handle and return and h the official down status. return Status( PyFunceble.STATUS["official"]["down"]).handle() # The whois record is empty. # We handle and return the official down status. return Status(PyFunceble.STATUS["official"]["down"]).handle()
def get(self): # pragma: no cover """ Execute the logic behind the meaning of ExpirationDate + return the matched status. :return: The status of the tested domain. Can be one of the official status. :rtype: str """ # We get the status of the domain validation. domain_validation = self.checker.is_domain_valid() # We get the status of the IPv4 validation. ip_validation = self.checker.is_ip_valid() if "current_test_data" in PyFunceble.INTERN: # The end-user want more information whith his test. # We update some index. PyFunceble.INTERN["current_test_data"].update({ "domain_syntax_validation": domain_validation, "ip4_syntax_validation": ip_validation, }) if (domain_validation and not ip_validation or domain_validation or PyFunceble.CONFIGURATION["local"]): # * The element is a valid domain. # and # * The element is not ahe valid IPv4. # or # * The element is a valid domain. # * We get the HTTP status code of the currently tested element. # and # * We try to get the element status from the IANA database. PyFunceble.INTERN.update({ "http_code": HTTPCode().get(), "referer": Referer().get() }) if not PyFunceble.INTERN["referer"]: # We could not get the referer. # We parse the referer status into the upstream call. return PyFunceble.INTERN["referer"] # The WHOIS record status is not into our list of official status. if PyFunceble.INTERN["referer"] and not self.checker.is_subdomain( ): # * The iana database comparison status is not None. # and # * The domain we are testing is not a subdomain. # We try to extract the expiration date from the WHOIS record. # And we return the matched status. return self._extract() # The iana database comparison status is None. # We log our whois record if the debug mode is activated. Logs().whois(self.whois_record) # And we return None, we could not extract the expiration date. return None if (ip_validation and not domain_validation or ip_validation or PyFunceble.CONFIGURATION["local"]): # * The element is a valid IPv4. # and # * The element is not a valid domain. # or # * The element is a valid IPv4. # We get the HTTP status code. PyFunceble.INTERN["http_code"] = HTTPCode().get() # We log our whois record if the debug mode is activated. Logs().whois(self.whois_record) # And we return None, there is no expiration date to look for. return None # The validation was not passed. # We log our whois record if the debug mode is activated. Logs().whois(self.whois_record) # And we return False, the domain could not pass the IP and domains syntax validation. return False
def get(self): """ Return the referer aka the WHOIS server of the current domain extension. :return: - :code:`None` if there is no referer. - :code:`False` if the extension is unknown which implicitly means that the subject is :code:`INVALID` :rtype: None|False|str """ if not PyFunceble.CONFIGURATION["local"]: # We are not running a test in a local network. if self.domain_extension not in self.ignored_extension: # The extension of the domain we are testing is not into # the list of ignored extensions. if self.domain_extension in PyFunceble.INTERN["iana_db"]: # The domain extension is in the iana database. if not PyFunceble.CONFIGURATION["no_whois"]: # We are authorized to use WHOIS for the test result. # We get the referer from the database. referer = PyFunceble.INTERN["iana_db"][self.domain_extension] if not referer: # The referer is not filled. # We log the case of the current extension. Logs().referer_not_found( self.subject, self.domain_extension ) # And we handle and return None status. return None # The referer is into the database. # We return the extracted referer. return referer # We are not authorized to use WHOIS for the test result. # We return None. return None # The domain extension is not in the iana database. # We return False, it is an invalid domain. return False # The extension of the domain we are testing is not into # the list of ignored extensions. # We return None, the domain does not have a whois server. return None # We are running a test in a local network. # We return None. return None