validateInput method

  1. @override
ValidationResult validateInput(
  1. Map<String, dynamic> input
)
override

Validate input before execution and permission checks.

Implementation

@override
ValidationResult validateInput(Map<String, dynamic> input) {
  // Validate operation.
  final opStr = input['operation'] as String?;
  if (opStr == null || !isValidLspOperation(opStr)) {
    return ValidationResult.invalid('Invalid operation: $opStr');
  }

  // Validate file path.
  final filePath = input['filePath'] as String?;
  if (filePath == null || filePath.isEmpty) {
    return const ValidationResult.invalid('filePath is required');
  }

  final absolutePath = _expandPath(filePath);

  // SECURITY: Skip filesystem checks for UNC paths.
  if (absolutePath.startsWith('\\\\') || absolutePath.startsWith('//')) {
    return const ValidationResult.valid();
  }

  // Check file exists.
  final file = File(absolutePath);
  if (!file.existsSync()) {
    return ValidationResult.invalid('File does not exist: $filePath');
  }

  if (!file.statSync().type.toString().contains('file')) {
    return ValidationResult.invalid('Path is not a file: $filePath');
  }

  // Validate line/character are positive integers.
  final line = input['line'];
  if (line is! int || line < 1) {
    return const ValidationResult.invalid('line must be a positive integer');
  }

  final character = input['character'];
  if (character is! int || character < 1) {
    return const ValidationResult.invalid(
      'character must be a positive integer',
    );
  }

  return const ValidationResult.valid();
}