{"record":{"id":"78db5d92cab77704","repo":"ZhuLinsen/daily_stock_analysis","slug":"source-url-must-not-contain-credentials","errorCode":null,"errorMessage":"source url must not contain credentials","messagePattern":"source url must not contain credentials","errorType":"validation","errorClass":"IntelligenceServiceError","httpStatus":400,"severity":"error","filePath":"src/services/intelligence_service.py","lineNumber":399,"sourceCode":"        return {\n            \"name\": name[:100],\n            \"source_type\": source_type,\n            \"url\": url,\n            \"enabled\": enabled,\n            \"scope_type\": scope_type,\n            \"scope_value\": scope_value[:64] if scope_value else None,\n            \"market\": market,\n            \"description\": description,\n        }\n\n    def _validate_url(self, raw_url: str, *, allow_no_url: bool = False) -> None:\n        if allow_no_url and raw_url.startswith(\"no-url:intel:\"):\n            return\n        parsed = urlparse(raw_url)\n        if parsed.scheme.lower() not in {\"http\", \"https\"} or not parsed.netloc:\n            raise IntelligenceServiceError(\"source url must be an absolute http(s) URL\")\n        if parsed.username or parsed.password:\n            raise IntelligenceServiceError(\"source url must not contain credentials\")\n        hostname = (parsed.hostname or \"\").strip().lower().rstrip(\".\")\n        if not hostname:\n            raise IntelligenceServiceError(\"source url host is required\")\n        if hostname in _PRIVATE_HOSTNAMES or hostname.endswith(\".local\"):\n            raise IntelligenceServiceError(\"source url host is not allowed\")\n        has_public_address = False\n        try:\n            ip = ipaddress.ip_address(hostname)\n        except ValueError:\n            ip = None\n        if ip is not None:\n            if self._is_blocked_ip(ip):\n                raise IntelligenceServiceError(\"source url must not target private or local network addresses\")\n            return\n        try:\n            addr_infos = socket.getaddrinfo(hostname, None)\n        except OSError as exc:\n            raise IntelligenceServiceError(f\"source url host DNS resolution failed: {hostname}\") from exc","sourceCodeStart":381,"sourceCodeEnd":417,"githubUrl":"https://github.com/ZhuLinsen/daily_stock_analysis/blob/5159bd72e8373d215492dff122acc9d389e219c9/src/services/intelligence_service.py#L381-L417","documentation":"Error \"source url must not contain credentials\" thrown in ZhuLinsen/daily_stock_analysis.","triggerScenarios":"Thrown at src/services/intelligence_service.py:399 when the library encounters an invalid state.","commonSituations":"Raised when an intelligence source URL embeds credentials; occurs with URLs of the form https://user:pass@host which are rejected for security.","solutions":["Remove any user:password@ credentials embedded in the source URL.","Store credentials separately if the upstream requires auth; do not put them in the URL.","Re-enter the URL without the userinfo segment."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"5159bd72e8373d215492dff122acc9d389e219c9","analyzedAt":"2026-08-15T01:59:36.292Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}