Tencent/WeKnora · error
invalid source path: %w
Error message
invalid source path: %w
What it means
This error is returned by ossFileService.CopyFile when utils.SafeObjectKey rejects the object key extracted from srcPath. SafeObjectKey guards against path traversal and unsafe key content (../ segments, absolute keys, illegal characters) before the server-side CopyObject is issued. This is a security-oriented validation failure, not an OSS API failure.
Source
Thrown at internal/application/service/file/oss.go:261
if err != nil {
return "", fmt.Errorf("failed to upload bytes to OSS: %w", err)
}
return fmt.Sprintf("oss://%s/%s", targetBucket, objectName), nil
}
// CopyFile copies an existing OSS object to a new knowledge-owned object using a
// server-side CopyObject (no data leaves OSS). The destination uses the same
// layout as SaveFile. Returns ErrCrossBackendCopy when srcPath is not an oss:// path.
func (s *ossFileService) CopyFile(ctx context.Context,
srcPath string, tenantID uint64, knowledgeID string,
) (string, error) {
srcBucket, srcKey, err := parseOssFilePath(srcPath)
if err != nil {
return "", fmt.Errorf("oss copy rejected source %q: %w", srcPath, ErrCrossBackendCopy)
}
if err := utils.SafeObjectKey(srcKey); err != nil {
return "", fmt.Errorf("invalid source path: %w", err)
}
ext := filepath.Ext(srcPath)
destKey := fmt.Sprintf("%s%d/%s/%s%s", s.pathPrefix, tenantID, knowledgeID, uuid.New().String(), ext)
_, err = s.client.CopyObject(ctx, &oss.CopyObjectRequest{
Bucket: oss.Ptr(s.bucketName),
Key: oss.Ptr(destKey),
SourceBucket: oss.Ptr(srcBucket),
SourceKey: oss.Ptr(srcKey),
})
if err != nil {
return "", fmt.Errorf("failed to copy file in OSS: %w", err)
}
newPath := fmt.Sprintf("oss://%s/%s", s.bucketName, destKey)
logger.Infof(ctx, "Copied OSS object %s to %s", srcPath, newPath)
return newPath, nilView on GitHub (pinned to 988cbb0330)
Solutions
- Log the offending key and reject the request upstream — do not attempt to sanitize blindly.
- Validate/normalize object keys with utils.SafeObjectKey before persisting or accepting them from clients.
- Ensure keys are generated server-side (as SaveFile does with UUIDs) rather than taken from user input.
- Audit data stores for legacy keys containing traversal or control characters.
Example fix
// before
srcBucket, srcKey, _ := parseOssFilePath(userInput)
newPath, err := svc.CopyFile(ctx, userInput, tenantID, knowledgeID)
// after
_, srcKey, err := parseOssFilePath(userInput)
if err == nil {
if safeErr := utils.SafeObjectKey(srcKey); safeErr != nil {
return fmt.Errorf("rejected unsafe key %q", srcKey)
}
}
newPath, err := svc.CopyFile(ctx, userInput, tenantID, knowledgeID) Defensive patterns
Strategy: validation
Validate before calling
_, srcKey, err := parseOssFilePath(srcPath)
if err == nil {
if err := utils.SafeObjectKey(srcKey); err != nil {
return fmt.Errorf("reject unsafe source key %q", srcKey)
}
} Try / catch
if err := copyFile(...); err != nil {
if strings.Contains(err.Error(), "invalid source path") {
// treat as client error (400), never retry
}
} Prevention
- Never accept raw object keys from clients; generate them server-side.
- Run utils.SafeObjectKey on every key at write/ingest time.
- Reject keys containing traversal segments or control characters before persistence.
- Audit legacy records for unsafe keys and remediate them.
When it happens
Trigger: Calling CopyFile with an oss:// path whose object key contains traversal sequences, leading slashes, or other characters rejected by utils.SafeObjectKey.
Common situations: User-supplied source keys passed through to CopyFile from an API endpoint; data migrated from another system with keys containing backslashes or '../'; tampered DB records or malicious clients probing for path traversal.
Related errors
- invalid file path: %w
- invalid file path: %w
- invalid source path: %w
- invalid file name: %w
- oss copy rejected source %q: %w
AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02).
Data as JSON: /api/errors/b73c725880ed16ed.
Report an issue: GitHub.