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, nil

View on GitHub (pinned to 988cbb0330)

Solutions

  1. Log the offending key and reject the request upstream — do not attempt to sanitize blindly.
  2. Validate/normalize object keys with utils.SafeObjectKey before persisting or accepting them from clients.
  3. Ensure keys are generated server-side (as SaveFile does with UUIDs) rather than taken from user input.
  4. 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

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


AI-assisted analysis of Tencent/WeKnora@988cbb0330 (2026-09-02). Data as JSON: /api/errors/b73c725880ed16ed. Report an issue: GitHub.