# Creating a robust, zero-config SFTP testing environment on different platforms

# Technical Summary

## 1. Project Objective

To build an automated testing suite for the `sftpR` package that functions seamlessly across three distinct environments without manual configuration or security interruptions.

## 2. The Core Challenges

### A. SSH Security Handshakes (The “Interactive” Problem)

- Host Key Fingerprints: Docker containers generate new SSH keys on every start. Standard clients detect this change and abort the connection to prevent “Man-in-the-Middle” attacks.
- Prompt Hanging: In CI/CD (GitHub Actions/`act`), there is no terminal user to type “yes” to the “Trust this host?” prompt, causing tests to time out or crash.

### B. Network Architecture Conflicts (The “Port” Problem)

- Local/Cloud VM: The R process runs outside the Docker engine. It must use Port Mapping (`127.0.0.1:2222` or `2223`) to reach the container.
- `act` (Local CI): The R process runs inside a container on the same Docker network. It sees the SFTP container as a “neighbor” and must use the Internal IP/Port (`sftp:22`).
- Port Clashing: Using port `2222` for both local dev and CI tests causes failures if a local container is already active.

## 3. Implemented Solutions

### Layer 1: R6 Class “Blindfold” (Security Bypass)

Modified the R handle initialization to bypass strict SSH checks. * `ssh_knownhosts = NULL`: Instructs `libcurl` to ignore the system `known_hosts` file. * `ssl_verifyhost = 0`: Prevents connection drops if the IP/Host doesn’t match the certificate/key exactly.

### Layer 2: Environment-Aware Routing (`helper-sftp.R`)

Implemented a logic gate that detects the runner environment and selects the correct connection string: * `act` Logic: Connects to `sftp` on Port 22. * Cloud Logic: Connects to `127.0.0.1` on Port 2223. * Local Logic: Connects to `127.0.0.1` on Port 2222.

### Layer 3: Dynamic Infrastructure (`R-CMD-check.yaml`)

- Isolation: Shifted the CI port to `2223` to prevent interference with local dev.
- DNS Injection: Used `docker inspect` to grab the internal IP and added it to `/etc/hosts` as `sftp`.
- Network Discovery: Added logic to identify the specific Docker network name used by `act` to ensure containers can “see” each other.

## 4. Modified Files & Impact

File | Change | Impact
--- | --- | ---
`R/sftp_connection.R` | Added bypass options to `curl` handle. | Eliminates “Host Key not OK” errors and interactive prompts.
`tests/testthat/helper-sftp.R` | Created `get_conn_info()`. | Switches between Internal (22) and External (2223) ports automatically.
`.github/workflows/R-CMD-check.yaml` | Reordered steps and added network/IP exports. | Ensures the SFTP server is ready and reachable before R tests begin.