{"record":{"id":"050590cd9d1a22d1","repo":"infiniflow/ragflow","slug":"oracle-cloud-infrastructure","errorCode":null,"errorMessage":"Oracle Cloud Infrastructure","messagePattern":"Oracle Cloud Infrastructure","errorType":"validation","errorClass":"ConnectorMissingCredentialError","httpStatus":null,"severity":"error","filePath":"common/data_source/blob_connector.py","lineNumber":111,"sourceCode":"                    raise ConnectorMissingCredentialError(\"Amazon S3\")\n\n            elif authentication_method == \"iam_role\":\n                if not credentials.get(\"aws_role_arn\"):\n                    raise ConnectorMissingCredentialError(\"Amazon S3 IAM role ARN is required\")\n\n            elif authentication_method == \"assume_role\":\n                pass\n\n            else:\n                raise ConnectorMissingCredentialError(\"Unsupported S3 authentication method\")\n\n        elif self.bucket_type == BlobType.GOOGLE_CLOUD_STORAGE:\n            if not all(credentials.get(key) for key in [\"access_key_id\", \"secret_access_key\"]):\n                raise ConnectorMissingCredentialError(\"Google Cloud Storage\")\n\n        elif self.bucket_type == BlobType.OCI_STORAGE:\n            if not all(credentials.get(key) for key in [\"namespace\", \"region\", \"access_key_id\", \"secret_access_key\"]):\n                raise ConnectorMissingCredentialError(\"Oracle Cloud Infrastructure\")\n\n        elif self.bucket_type == BlobType.S3_COMPATIBLE:\n            if not all(credentials.get(key) for key in [\"endpoint_url\", \"aws_access_key_id\", \"aws_secret_access_key\", \"addressing_style\"]):\n                raise ConnectorMissingCredentialError(\"S3 Compatible Storage\")\n\n        else:\n            raise ValueError(f\"Unsupported bucket type: {self.bucket_type}\")\n\n        # Create S3 client\n        self.s3_client = create_s3_client(self.bucket_type, credentials, self.european_residency)\n\n        # Detect bucket region (only important for S3)\n        if self.bucket_type == BlobType.S3:\n            self.bucket_region = detect_bucket_region(self.s3_client, self.bucket_name)\n\n        return None\n\n    def _build_document_from_obj(","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/common/data_source/blob_connector.py#L93-L129","documentation":"Raised by BlobStorageConnector.load_credentials when bucket_type is 'oci' (OCI_STORAGE) but the credentials dict is missing any of the four required keys: namespace, region, access_key_id, secret_access_key. The connector validates presence (truthiness) of each key before creating the S3-compatible client, so empty strings, None, or absent keys all fail. The exception message is just 'Oracle Cloud Infrastructure', identifying which provider's credentials were incomplete.","triggerScenarios":"Calling load_credentials({'bucket_type': 'oci', ...}) with a credentials dict lacking 'namespace' or 'region' (the two keys users most often forget, since the access key pair alone is not enough for OCI's S3-compatible endpoint). Also triggered when any of the four values is an empty string '' because the check uses truthiness (credentials.get(key)).","commonSituations":"Configuring an Onyx/Onyxdotdev blob storage connector for Oracle Cloud Object Storage; user copies AWS-style key/secret but omits the OCI namespace (e.g. 'idxa4bhqvvnh') or home region (e.g. 'us-ashburn-1'); values stored blank in a secrets manager and read back as empty strings.","solutions":["Supply all four credential keys in the connector credential config: namespace, region, access_key_id, secret_access_key","Get the namespace with 'oci os ns get' (or from the OCI console tenancy page) and the region from the console URL/console header","Create a Customer Secret Key (S3-compatible credential) in OCI under Identity > User > Customer Secret Keys if access_key_id/secret_access_key are missing","Verify no credential value is an empty string before calling load_credentials (empty strings fail the truthiness check)"],"exampleFix":"// before\nconnector.load_credentials({\n    'access_key_id': key,\n    'secret_access_key': secret,\n})\n// after\nconnector.load_credentials({\n    'namespace': 'my-tenancy-namespace',\n    'region': 'us-ashburn-1',\n    'access_key_id': key,\n    'secret_access_key': secret,\n})","handlingStrategy":"validation","validationCode":"REQUIRED_OCI = ['namespace', 'region', 'access_key_id', 'secret_access_key']\nmissing = [k for k in REQUIRED_OCI if not credentials.get(k)]\nif missing:\n    raise ValueError(f'OCI credentials missing: {missing}')\nconnector.load_credentials(credentials)","typeGuard":"def has_oci_credentials(c: dict) -> bool:\n    return all(isinstance(c.get(k), str) and c[k].strip() for k in\n               ['namespace', 'region', 'access_key_id', 'secret_access_key'])","tryCatchPattern":"try:\n    connector.load_credentials(creds)\nexcept ConnectorMissingCredentialError as e:\n    if 'Oracle' in str(e):\n        raise ConfigError('Provide namespace, region, access_key_id, secret_access_key for OCI') from e\n    raise","preventionTips":["Keep a per-provider required-keys table next to the connector config so UIs can validate before submit","Strip and reject empty credential strings at config-load time; load_credentials uses truthiness so blanks fail late"],"tags":["oci","credentials","blob-storage","configuration"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}