arg groups & formatting

This commit is contained in:
17ms 2023-05-22 04:54:49 +03:00
parent 60abc00526
commit 6b3f466b3c
10 changed files with 82 additions and 43 deletions

0
src/cli.rs Normal file
View File

View File

@ -1,7 +1,7 @@
use crate::crypto;
use std::{collections::HashMap, error::Error, net::SocketAddr, path::PathBuf};
use aes_gcm::{aead::consts::U12, aes::Aes256, AesGcm};
use rand::rngs::OsRng;
use std::{collections::HashMap, error::Error, net::SocketAddr, path::PathBuf};
use tokio::{
io::{BufReader, BufWriter},
net::{
@ -10,6 +10,8 @@ use tokio::{
},
};
use crate::crypto;
const PUBLIC_IPV4: &str = "https://ipinfo.io/ip";
const PUBLIC_IPV6: &str = "https://ipv6.icanhazip.com";

View File

@ -1,13 +1,15 @@
use crate::crypto;
use std::error::Error;
use aes_gcm::{aead::consts::U12, aes::Aes256, AesGcm};
use base64::{engine::general_purpose, Engine};
use rand::rngs::OsRng;
use std::error::Error;
use tokio::{
io::{AsyncBufReadExt, AsyncWriteExt, BufReader, BufWriter},
net::tcp::{ReadHalf, WriteHalf},
};
use crate::crypto;
pub async fn send(
writer: &mut BufWriter<WriteHalf<'_>>,
cipher: Option<&mut AesGcm<Aes256, U12>>,

View File

@ -1,8 +1,5 @@
use crate::{
common::{Connection, Message},
comms, crypto,
};
use std::{collections::HashMap, error::Error, net::SocketAddr, path::PathBuf};
use tokio::{
fs::File,
io::{AsyncWriteExt, BufWriter},
@ -10,6 +7,11 @@ use tokio::{
sync::mpsc,
};
use crate::{
common::{Connection, Message},
comms, crypto,
};
#[derive(Debug)]
pub struct Request {
pub name: String,

View File

@ -1,18 +1,19 @@
use super::comms;
use std::{error::Error, path::Path};
use aes_gcm::{
aead::{consts::U12, AeadMut},
aead::{consts::U12, Aead},
aes::Aes256,
Aes256Gcm, AesGcm, KeyInit, Nonce,
};
use rand::{distributions::Alphanumeric, Rng};
use rand::{rngs::OsRng, RngCore};
use std::{error::Error, path::Path};
use rand::{distributions::Alphanumeric, rngs::OsRng, Rng, RngCore};
use tokio::{
io::{BufReader, BufWriter},
net::tcp::{ReadHalf, WriteHalf},
};
use x25519_dalek::{EphemeralSecret, PublicKey, SharedSecret};
use crate::comms;
const AES_NONCE_SIZE: usize = 12;
const DH_PBK_SIZE: usize = 32;

View File

@ -1,7 +1,8 @@
pub mod cli;
pub mod common;
pub mod comms;
pub mod connector;
pub mod crypto;
pub mod listener;
pub mod parsers;
pub mod ui;
pub mod util;

View File

@ -1,8 +1,5 @@
use crate::{
common::{Connection, Message},
comms, crypto,
};
use std::{collections::HashMap, error::Error, net::SocketAddr, path::PathBuf, sync::Arc};
use tokio::{
fs::File,
io::AsyncReadExt,
@ -10,6 +7,11 @@ use tokio::{
sync::mpsc,
};
use crate::{
common::{Connection, Message},
comms, crypto,
};
#[derive(Debug, Clone)]
pub struct Listener {
host_addr: SocketAddr,

View File

@ -1,7 +1,9 @@
use clap::{Parser, Subcommand};
use contego::parsers::{addr_parser, dirpath_parser, filepath_parser};
use std::{error::Error, net::SocketAddr, path::PathBuf};
use clap::{command, ArgGroup, Parser, Subcommand};
use contego::parsers::{addr_parser, dirpath_parser, filepath_parser};
#[derive(Debug, Parser)]
#[command(about, version)]
struct Cli {
@ -15,25 +17,35 @@ struct Cli {
#[derive(Debug, Subcommand)]
enum Commands {
/// Host fileserver instance by providing JSON file with paths or list of paths
#[clap(group(ArgGroup::new("input").required(true).args(&["infile", "files"])))]
Host {
/// Host port
#[clap(short = 'p', long, default_value_t = 8080)]
port: u16,
/// Use IPv6 instead of IPv4
#[clap(short = '6', long, default_value_t = false)]
ipv6: bool,
/// Path to the inputfile
#[clap(short = 'i', long, value_parser = filepath_parser)]
#[clap(short = 'i', long, value_parser = filepath_parser, conflicts_with = "files", group = "input")]
infile: Option<PathBuf>,
/// Paths to the files (comma separated)
#[clap(short = 'f', long, num_args = 1.., value_parser = filepath_parser)]
/// Paths to the files
#[clap(short = 'f', long, num_args = 1.., value_parser = filepath_parser, conflicts_with = "infile", group = "input")]
files: Option<Vec<PathBuf>>,
/// Outgoing traffic chunksize in bytes
#[clap(short = 'c', long, default_value_t = 8192)]
chunksize: usize,
/// Host the files locally
#[clap(short = 'l', long, default_value_t = false)]
local: bool,
},
/// Connect to hosted server by providing address, output folder and access key
Connect {
/// IP address of the server (IPv4 or IPv6)
#[clap(short = 'a', long, value_parser = addr_parser)]
address: SocketAddr,
addr: SocketAddr,
/// Path to the output folder
#[clap(short = 'o', long, value_parser = dirpath_parser)]
outdir: PathBuf,
out: PathBuf,
/// Access key for the fileserver
#[clap(short = 'k', long)]
key: String,
@ -43,7 +55,18 @@ enum Commands {
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let cli = Cli::parse();
println!("{:?}", cli);
match cli.command {
Commands::Host {
port,
ipv6,
infile,
files,
chunksize,
local,
} => {}
Commands::Connect { addr, out, key } => {}
};
Ok(())
}

View File

@ -1,17 +0,0 @@
/*
TODO:
- suspend everything except errors and critical exceptions that lead to panic or abort
server:
- ip & access key on display
- commands to copy ip/key to clipboard
- updating list/log of connecting/disconnecting clients (?)
client:
- connection ip on display
- comamnds to download one or more files
- updating list of available/downloading/downloaded files (?)
* (?): maybe requires a separate UI thread for updates
*/

23
src/util.rs Normal file
View File

@ -0,0 +1,23 @@
use std::{error::Error, fs, path::PathBuf};
fn get_filepaths(
infile: Option<PathBuf>,
files: Option<Vec<PathBuf>>,
) -> Result<Vec<PathBuf>, Box<dyn Error>> {
let mut filepaths = Vec::new();
if let Some(infile) = infile {
let paths = fs::read_to_string(infile)?;
for path in paths.lines() {
filepaths.push(PathBuf::from(path));
}
}
if let Some(files) = files {
for file in files {
filepaths.push(file);
}
}
Ok(filepaths)
}