|
34 | 34 | from zope.interface import implementer |
35 | 35 |
|
36 | 36 | from warehouse.admin.flags import AdminFlagValue |
| 37 | +from warehouse.cache import IQueryResultsCache |
37 | 38 | from warehouse.email import send_pending_trusted_publisher_invalidated_email |
38 | 39 | from warehouse.events.tags import EventTag |
39 | 40 | from warehouse.helpdesk.interfaces import IAdminNotificationService |
@@ -411,13 +412,18 @@ def create_service(cls, context, request): |
411 | 412 |
|
412 | 413 | @implementer(IProjectService) |
413 | 414 | class ProjectService: |
414 | | - def __init__(self, session, metrics=None, ratelimiters=None) -> None: |
| 415 | + def __init__( |
| 416 | + self, session, metrics=None, ratelimiters=None, query_results_cache=None |
| 417 | + ) -> None: |
415 | 418 | if ratelimiters is None: |
416 | 419 | ratelimiters = {} |
| 420 | + if query_results_cache is None: |
| 421 | + query_results_cache = {} |
417 | 422 |
|
418 | 423 | self.db = session |
419 | 424 | self.ratelimiters = collections.defaultdict(DummyRateLimiter, ratelimiters) |
420 | 425 | self._metrics = metrics |
| 426 | + self._query_results_cache = query_results_cache |
421 | 427 |
|
422 | 428 | def _check_ratelimits(self, request, creator): |
423 | 429 | # First we want to check if a single IP is exceeding our rate limiter. |
@@ -486,7 +492,10 @@ def check_project_name(self, name: str) -> None: |
486 | 492 | raise ProjectNameUnavailableSimilarError(similar_project_name) |
487 | 493 |
|
488 | 494 | # Check for typo-squatting. |
489 | | - if typo_check_match := typo_check_name(canonicalize_name(name)): |
| 495 | + cached_corpus = self._query_results_cache.get("top_dependents_corpus") |
| 496 | + if typo_check_match := typo_check_name( |
| 497 | + canonicalize_name(name), corpus=cached_corpus |
| 498 | + ): |
490 | 499 | raise ProjectNameUnavailableTypoSquattingError( |
491 | 500 | check_name=typo_check_match[0], |
492 | 501 | existing_project_name=typo_check_match[1], |
@@ -718,4 +727,10 @@ def project_service_factory(context, request): |
718 | 727 | IRateLimiter, name="project.create.ip", context=None |
719 | 728 | ), |
720 | 729 | } |
721 | | - return ProjectService(request.db, metrics=metrics, ratelimiters=ratelimiters) |
| 730 | + query_results_cache = request.find_service(IQueryResultsCache) |
| 731 | + return ProjectService( |
| 732 | + request.db, |
| 733 | + metrics=metrics, |
| 734 | + ratelimiters=ratelimiters, |
| 735 | + query_results_cache=query_results_cache, |
| 736 | + ) |
0 commit comments