socksprox 0.1.0

Simple SOCKS5 Proxy Server in Rust. Probably shouldn't use this, but you can.
Documentation
# socksprox
Simple SOCKS5 Proxy Server in Rust. Probably shouldn't use this, but you can.

[Install Instructions](#Install)

A super simple, feature-lacking async SOCKS5 server.
Currently only supports the CONNECT command (TCP) and limited authentication
(Username/Password). No authentication is also supported.

## But Why
Why would you want to use this? You probably don't, better implementations exist. BUT if you
want a straightforward, easy-to-use SOCKS5 library, well, you found it. This can be used (along
with the provided binary) to quickly and easily deploy a SOCKS5 Server.

To use in your own binary, all you need is the tokio runtime. Using anyhow for errors is also
convienent to easily handle errors provided by the library. The main function for the binary
in it's nascent stages looked something like this:

```rust
use socksprox::Socks5Server;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let mut server = match Socks5Server::new("0.0.0.0", 4444, None, None).await {
        Ok(s) => s,
        Err(e) => { return Err(anyhow::anyhow!("Error starting server: {e}")); }
    };

    server.serve().await;

    Ok(())
}
```

## Install
Add the library to your project to be able to quickly add a Socks5 proxy to your
existing code with:

```bash
cargo add socksprox
```

If you want to run the provided binary, use `cargo` to install it:

```bash
cargo install socksprox
```

To build from source (which you technically do with `cargo install`):

```bash
git clone https://github.com/carterburn/socksprox.git
cd socksprox
cargo build --release
```

Compiling for different OS / architectures can be done using standard `cargo`
arguments if you have the requisite Rust toolchain installed.


## Contributing
PR's are definitely welcome. Feautres that could be nice:

- [ ] UDPAssociate 
- [ ] Bind
- [ ] More than username/password authentication
- [ ] Better argument handling
- [ ] Generic impl for the server (don't hardcode TcpStream, but use Tokio's
AsyncRead/WriteExt as a trait bound)

## Credits
I sought some help from merino (another SOCKS5 implementation in Rust) that
can be found [here](https://github.com/ajmwagar/merino/tree/master). The design
is roughly the same with some tweaks here or there that I added. The 'additions'
that I added are probably not correct or industry standard, but gave it my best
shot. If clippy didn't complain, it's perfect in my opinion. 

The RFC for SOCKS5 is very easy to understand as well, so it was a good first
stab at implementing a network protocol in Rust. [RFC1928](https://datatracker.ietf.org/doc/html/rfc1928)

### Still Asking Why
I am trying to learn how to use tokio and needed something small that I could start working toward. 🧑‍🔧
Hoping to put out better projects using tokio in the future. Have to start
somewhere.