# BProxy

BProxy (Bottler Proxy)

## Tabla de contenidos
  - [Requisitos <a name="requisitos"></a>](#requisitos-)
  - [Compilación <a name="compilación"></a>](#compilación-)
  - [Ejecución <a name="ejecución"></a>](#ejecución-)
  - [Casos de uso <a name="casos-de-uso"></a>](#casos-de-uso-)
  - [Testeos <a name="tests"></a>](#testeos-)
  - [Limpieza <a name="limpieza"></a>](#limpieza-)
  - [Documentación <a name="documentación"></a>](#documentación-)

## Requisitos <a name="requisitos"></a>

Debe instalar gcc y make. Estos se encuentran disponibles en el repositorio de la vasta mayoría de distribuciones de Linux/macOS.

## Compilación <a name="compilación"></a>

Para compilar todos los archivos se debe hacer:

```bash
make all
```

## Ejecución <a name="ejecución"></a>

Ahora, tendrá dos ejecutables: `client` y `socks5d`. 

El servidor por defecto utilizará un _TOKEN_ que debe ser una `environment` variable. Por ejemplo, puede configurar una mediante:

```bash
export BPROXY_TOKEN=0x0FF1CEDEADB00B1E
```

Si no se encuentra una token al momento de ejecutar el `server` el mismo terminará con error.

Ahora, puede correr el `server` y luego, si desea hacer alguna configuración, conectarse con el `client`.

```bash
./socks5d ${PARAMS}
```

y en otra terminal

```bash
./client ${PARAMS}
```

Debe notar que el server espera un token como el que se mencionó anteriormente (en formato hexadecimal) mientras que el cliente espera un número decimal (véase la siguiente sección para más información).

## Casos de uso <a name="casos-de-uso"></a>

Se mostrarán dos casos típicos de uso del servidor.

Aquí se tiene al servidor proxy corriendo en `127.0.0.1:1080` y se utiliza a este para conectarse a `192.168.10.120:110` (una PC corriendo un servidor POP3). Además, se está autenticando con el usuario `user:pass`.

```bash
./socks5d -u user:pass
ncat -C -v --proxy 127.0.0.1:1080 --proxy-type socks5 192.168.10.120 110 --proxy-auth user:pass
```

Por otro lado, aquí se usó `curl` para acceder a http://api.ipify.org mediante el proxy (también corriendo en la misma IP que el ejemplo anterior).

```bash
./socks5d -u user:pass
curl -x socks5://user:pass@127.0.0.1:1080 http://api.ipify.org
```

Ahora, se mostrará un caso de uso para el cliente de configuración.

Se quiere obtener la cantidad de páginas de usuarios que hay en el servidor proxy, mediante -L se especifica la direccion IP del servidor de configuración (por defecto `127.0.0.1`), con -P se especifica el puerto (por defecto `8080`).

```bash
export BPROXY_TOKEN=0x0FF1CEDEADB00B1E
./socks5d -u user:pass
./client 1148926835748244254 -L 192.168.10.119 -P 8100 -f
```

Una vez que se obtiene la cantidad de páginas se le pide el listado de usuarios pertenecientes a la 2da página, en caso de que el servidor no cuente con usuarios suficientes para tener 2 páginas, imprimirá un error especificando que el valor pasado no es válido. En cambio, si se cuentan con usuarios suficientes se listarán separados por un '\n'.

```bash
./client 1148926835748244254 -L 192.168.10.119 -P 8100 -u 2
```

Note que `0x0FF1CEDEADB00B1E` (base 16) = `1148926835748244254` (base 10).

## Testeos <a name="tests"></a>

En orden de realizar un análisis estático del sistema usted debe tener instalado [cppcheck](http://cppcheck.net/) y [pvs-studio](https://pvs-studio.com/). Luego, puede correrlos con:

```bash
make test
```

Por último, si quiere hacer un análisis dinámico (usando [valgrind](https://valgrind.org/)) puede hacerlo mediante:

```bash
valgrind ./socks5d
```

Debe tener el cuidado de recompilarlo eliminando los flags de compilación `-fsanitize=address -fno-omit-frame-pointer`.

## Limpieza <a name="limpieza"></a>
Si desea borrar los archivos creados luego de la compilación (y los testeos si se hubiesen corrido) debe correr:

```bash
make clean
```

## Documentación <a name="documentación"></a>
Debe notar que el informe y el rfc del protocolo BCP se encuentran en la carpeta `docs/` (junto con el `man` de socks5d).

# Autores
### Bottler:
   - Barmasch, Juan Martín (61033)
   - Bellver, Ezequiel (61268)
   - Lo Coco, Santiago (61301)