Skip to content

Commit 8ea9c32

Browse files
committed
Introduction of a better split.
Indeed, before this patch, it was had to differ IP from domains. This patch fixes the issue by introduction a new `subject_kind` status key which can be used when a split between domains and ips is necessary. This patch also introduces a better recognition of domains and IP when testing from the CLI.
1 parent 17f5de7 commit 8ea9c32

File tree

25 files changed

+443
-94
lines changed

25 files changed

+443
-94
lines changed

PyFunceble/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
from PyFunceble.checker.reputation.ip import IPReputationChecker
6464
from PyFunceble.checker.reputation.url import URLReputationChecker
6565
from PyFunceble.checker.syntax.domain import DomainSyntaxChecker
66+
from PyFunceble.checker.syntax.domain_and_ip import DomainAndIPSyntaxChecker
6667
from PyFunceble.checker.syntax.ip import IPSyntaxChecker
6768
from PyFunceble.checker.syntax.ipv4 import IPv4SyntaxChecker
6869
from PyFunceble.checker.syntax.ipv6 import IPv6SyntaxChecker

PyFunceble/checker/availability/base.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -516,16 +516,7 @@ def subject_propagator(self) -> "CheckerBase":
516516
self.status.dns_lookup_record = self.dns_query_tool.lookup_record
517517
self.status.whois_lookup_record = self.whois_query_tool.lookup_record
518518

519-
self.status.subject = self.subject
520-
self.status.idna_subject = self.idna_subject
521-
self.status.netloc = self.url2netloc.set_data_to_convert(
522-
self.idna_subject
523-
).get_converted()
524-
self.status.status = None
525-
526-
self.query_syntax_checker()
527-
528-
return self
519+
return super().subject_propagator()
529520

530521
def should_we_continue_test(self, status_post_syntax_checker: str) -> bool:
531522
"""
@@ -657,7 +648,7 @@ def guess_all_settings(
657648

658649
return self
659650

660-
def query_syntax_checker(self) -> "AvailabilityCheckerBase":
651+
def query_common_checker(self) -> "AvailabilityCheckerBase":
661652
"""
662653
Queries the syntax checker.
663654
"""
@@ -685,7 +676,7 @@ def query_syntax_checker(self) -> "AvailabilityCheckerBase":
685676
"Finished to check the syntax of %r", self.status.idna_subject
686677
)
687678

688-
return self
679+
return super().query_common_checker()
689680

690681
@CheckerBase.ensure_subject_is_given
691682
def query_dns_record(self) -> Optional[Dict[str, Optional[List[str]]]]:

PyFunceble/checker/availability/domain_and_ip.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,40 @@ def query_status(
100100
query_object: Union[IPAvailabilityChecker, DomainAvailabilityChecker] = None
101101

102102
if self.status.ip_syntax:
103-
query_object = IPAvailabilityChecker()
103+
query_object = IPAvailabilityChecker(
104+
self.subject,
105+
use_extra_rules=self.use_extra_rules,
106+
use_whois_lookup=self.use_whois_lookup,
107+
use_dns_lookup=self.use_dns_lookup,
108+
use_netinfo_lookup=self.use_netinfo_lookup,
109+
use_http_code_lookup=self.use_http_code_lookup,
110+
use_reputation_lookup=self.use_reputation_lookup,
111+
do_syntax_check_first=self.do_syntax_check_first,
112+
db_session=self.db_session,
113+
use_whois_db=self.use_whois_db,
114+
use_collection=self.use_collection,
115+
)
104116
else:
105-
query_object = DomainAvailabilityChecker()
106-
107-
query_object.__dict__ = self.__dict__
117+
query_object = DomainAvailabilityChecker(
118+
self.subject,
119+
use_extra_rules=self.use_extra_rules,
120+
use_whois_lookup=self.use_whois_lookup,
121+
use_dns_lookup=self.use_dns_lookup,
122+
use_netinfo_lookup=self.use_netinfo_lookup,
123+
use_http_code_lookup=self.use_http_code_lookup,
124+
use_reputation_lookup=self.use_reputation_lookup,
125+
do_syntax_check_first=self.do_syntax_check_first,
126+
db_session=self.db_session,
127+
use_whois_db=self.use_whois_db,
128+
use_collection=self.use_collection,
129+
)
130+
131+
query_object.dns_query_tool = self.dns_query_tool
132+
query_object.whois_query_tool = self.whois_query_tool
133+
query_object.collection_query_tool = self.collection_query_tool
134+
query_object.hostbyaddr_query_tool = self.hostbyaddr_query_tool
135+
query_object.addressinfo_query_tool = self.addressinfo_query_tool
136+
query_object.http_status_code_query_tool = self.http_status_code_query_tool
108137

109138
result = query_object.query_status()
110139

PyFunceble/checker/availability/url.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def subject_propagator(self) -> "URLAvailabilityChecker":
125125

126126
self.status.status = None
127127

128-
self.query_syntax_checker()
128+
self.query_common_checker()
129129

130130
return self
131131

PyFunceble/checker/base.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,11 +374,42 @@ def subject_propagator(self) -> "CheckerBase":
374374
Propagate the currently set subject.
375375
376376
.. warning::
377-
You are not invited to run this method directly.
377+
Be sure to use setup your status first.
378+
"""
379+
380+
self.status.subject = self.subject
381+
self.status.idna_subject = self.idna_subject
382+
self.status.netloc = self.url2netloc.set_data_to_convert(
383+
self.idna_subject
384+
).get_converted()
385+
self.status.status = None
386+
387+
return self.query_common_checker()
378388

379-
Only the :code:`propagate_subject` decorator should call this
380-
method.
389+
def query_common_checker(self) -> "CheckerBase":
381390
"""
391+
Queries the common checkers.
392+
393+
.. warning::
394+
Be sure to use setup your status first.
395+
"""
396+
397+
if not self.status.subject_kind:
398+
cls_name = self.__class__.__name__.lower()
399+
if (
400+
hasattr(self.status, "ip_syntax") and self.status.ip_syntax
401+
) or "ip" in cls_name:
402+
self.status.subject_kind = "ip"
403+
elif (
404+
hasattr(self.status, "url_syntax") and self.status.url_syntax
405+
) or "url" in cls_name:
406+
self.status.subject_kind = "url"
407+
elif (
408+
hasattr(self.status, "domain_syntax") and self.status.domain_syntax
409+
) or "domain" in cls_name:
410+
self.status.subject_kind = "domain"
411+
else:
412+
self.status.subject_kind = "unknown"
382413

383414
return self
384415

PyFunceble/checker/reputation/base.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,7 @@ def subject_propagator(self) -> "CheckerBase":
136136
self.status.params = self.params
137137
self.status.dns_lookup_record = self.dns_query_tool.lookup_record
138138

139-
self.status.subject = self.subject
140-
self.status.idna_subject = self.idna_subject
141-
self.status.netloc = self.url2netloc.set_data_to_convert(
142-
self.idna_subject
143-
).get_converted()
144-
145-
self.query_syntax_checker()
146-
147-
return self
139+
return super().subject_propagator()
148140

149141
def should_we_continue_test(self, status_post_syntax_checker: str) -> bool:
150142
"""
@@ -156,17 +148,17 @@ def should_we_continue_test(self, status_post_syntax_checker: str) -> bool:
156148
or status_post_syntax_checker == PyFunceble.storage.STATUS.invalid
157149
)
158150

159-
def query_syntax_checker(self) -> "ReputationCheckerBase":
151+
def query_common_checker(self) -> "ReputationCheckerBase":
160152
"""
161-
Queries the syntax checker.
153+
Queries the common checkers.
162154
"""
163155

164156
self.status.second_level_domain_syntax = (
165157
self.domain_syntax_checker.is_valid_second_level()
166158
)
167159
self.status.subdomain_syntax = self.domain_syntax_checker.is_valid_subdomain()
168-
self.status.domain_syntax = bool(
169-
self.status.subdomain_syntax or self.status.second_level_domain_syntax
160+
self.status.domain_syntax = bool(self.status.subdomain_syntax) or bool(
161+
self.status.second_level_domain_syntax
170162
)
171163

172164
self.status.ipv4_syntax = self.ip_syntax_checker.is_valid_v4()
@@ -176,7 +168,7 @@ def query_syntax_checker(self) -> "ReputationCheckerBase":
176168
self.status.ip_syntax = bool(self.status.ipv4_syntax or self.status.ipv6_syntax)
177169
self.status.url_syntax = self.url_syntax_checker.is_valid()
178170

179-
return self
171+
return super().query_common_checker()
180172

181173
def query_a_record(self) -> Optional[List[str]]:
182174
"""

PyFunceble/checker/reputation/domain_and_ip.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,23 @@ def query_status(self) -> "DomainAndIPReputationChecker":
7474
"""
7575

7676
if self.status.ip_syntax:
77-
query_object = IPReputationChecker()
77+
query_object = IPReputationChecker(
78+
self.subject,
79+
do_syntax_check_first=self.do_syntax_check_first,
80+
db_session=self.db_session,
81+
use_collection=self.use_collection,
82+
)
7883
else:
79-
query_object = DomainReputationChecker()
80-
81-
query_object.__dict__ = self.__dict__
84+
query_object = DomainReputationChecker(
85+
self.subject,
86+
do_syntax_check_first=self.do_syntax_check_first,
87+
db_session=self.db_session,
88+
use_collection=self.use_collection,
89+
)
90+
91+
query_object.ipv4_reputation_query_tool = self.ipv4_reputation_query_tool
92+
query_object.collection_query_tool = self.collection_query_tool
93+
query_object.dns_query_tool = self.dns_query_tool
8294

8395
result = query_object.query_status()
8496

PyFunceble/checker/status_base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ class CheckerStatusBase:
6565
Provides the base of all status classes.
6666
"""
6767

68+
subject_kind: Optional[str] = None
69+
6870
subject: Optional[str] = None
6971
idna_subject: Optional[str] = None
7072
netloc: Optional[str] = None

PyFunceble/checker/syntax/base.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,7 @@ def subject_propagator(self) -> "CheckerBase":
9696

9797
self.status = SyntaxCheckerStatus()
9898

99-
self.status.subject = self.subject
100-
self.status.idna_subject = self.idna_subject
101-
self.status.netloc = self.url2netloc.set_data_to_convert(
102-
self.idna_subject
103-
).get_converted()
104-
105-
return self
99+
return super().subject_propagator()
106100

107101
@CheckerBase.ensure_subject_is_given
108102
@CheckerBase.update_status_date_after_query

PyFunceble/checker/syntax/domain.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,9 @@ def subject_propagator(self) -> "DomainSyntaxChecker":
9595
self.subdomain_checker.subject = self.idna_subject
9696

9797
self.status = SyntaxCheckerStatus()
98+
self.status.subject_kind = "domain"
9899

99-
self.status.subject = self.subject
100-
self.status.idna_subject = self.idna_subject
101-
self.status.netloc = self.url2netloc.set_data_to_convert(
102-
self.idna_subject
103-
).get_converted()
104-
105-
return self
100+
return super().subject_propagator()
106101

107102
@DomainSyntaxCheckerBase.ensure_subject_is_given
108103
def is_valid(self) -> bool:

0 commit comments

Comments
 (0)