7 Commits

Author SHA1 Message Date
53fbc596da Update Rust crate log to 0.4.27
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-04 00:34:16 +00:00
b205a2b030 Update Rust crate env_logger to 0.11.8
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-03 00:34:11 +00:00
0b4bac96e7 Update Rust crate clap to 4.5.35
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-02 00:34:10 +00:00
aba478e00d Update Rust crate actix-web to 4.10.2
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2025-04-01 02:04:45 +00:00
39beb75a71 Refresh repository
All checks were successful
continuous-integration/drone/push Build is passing
2025-03-31 23:52:58 +02:00
ae754241ce Handle restricted ports 2024-08-22 09:42:10 +02:00
b52fbca4fd Fix listen host 2024-08-22 08:59:31 +02:00
7 changed files with 718 additions and 325 deletions

39
.drone.yml Normal file
View File

@ -0,0 +1,39 @@
---
kind: pipeline
type: docker
name: default
steps:
- name: fetch_dependencies
image: rust
volumes:
- name: rust_registry
path: /usr/local/cargo/registry
commands:
- cargo fetch
- name: code_quality
image: rust
volumes:
- name: rust_registry
path: /usr/local/cargo/registry
depends_on:
- fetch_dependencies
commands:
- rustup component add clippy
- cargo clippy -- -D warnings
- name: test
image: rust
volumes:
- name: rust_registry
path: /usr/local/cargo/registry
depends_on:
- code_quality
commands:
- cargo test
volumes:
- name: rust_registry
temp: {}

866
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,11 @@
[package]
name = "hidden_server"
version = "0.1.0"
edition = "2021"
edition = "2024"
[dependencies]
log = "0.4.22"
env_logger = "0.11.5"
actix-web = "4"
log = "0.4.27"
env_logger = "0.11.8"
actix-web = "4.10.2"
rand = "0.9.0-alpha.2"
clap = { version = "4.5.16", features = ["derive"] }
clap = { version = "4.5.35", features = ["derive"] }

4
renovate.json Normal file
View File

@ -0,0 +1,4 @@
{
"extends": ["local>renovate/presets"]
}

1
src/lib.rs Normal file
View File

@ -0,0 +1 @@
pub mod restricted_port;

View File

@ -1,6 +1,7 @@
use actix_web::middleware::Logger;
use actix_web::{web, App, HttpResponse, HttpServer};
use actix_web::{App, HttpResponse, HttpServer, web};
use clap::Parser;
use hidden_server::restricted_port::is_restricted_port;
use log::LevelFilter;
use rand::Rng;
@ -21,6 +22,9 @@ struct Args {
/// Maximal port this server will listen to
#[arg(short('M'), long, default_value_t = 1000)]
max_port: u16,
/// Host this server will listen to
#[arg(short, long, default_value = "0.0.0.0")]
listen_host: String,
}
#[actix_web::main]
@ -39,15 +43,37 @@ async fn main() -> std::io::Result<()> {
log::info!("Choosing a random port to start...");
let mut rng = rand::thread_rng();
let port: u16 = args.min_port + rng.random::<u16>() % (args.max_port - args.min_port);
let mut rng = rand::rng();
let mut port: u16;
loop {
port = args.min_port + rng.random::<u16>() % (args.max_port - args.min_port);
if !is_restricted_port(port) {
break;
}
log::info!("I chose a restricted port, I have to choose another one...");
}
log::info!("Can now start server...");
HttpServer::new(|| {
App::new()
.wrap(Logger::default())
.route("/", web::get().to(home))
})
.bind(("127.0.0.1", port))?
.bind((args.listen_host, port))?
.run()
.await
}
#[cfg(test)]
mod test {
use crate::Args;
#[test]
fn verify_cli() {
use clap::CommandFactory;
Args::command().debug_assert()
}
}

89
src/restricted_port.rs Normal file
View File

@ -0,0 +1,89 @@
// Source : https://chromium.googlesource.com/chromium/src.git/+/refs/heads/master/net/base/port_util.cc
const RESTRICTED_PORTS: [u16; 80] = [
1, // tcpmux
7, // echo
9, // discard
11, // systat
13, // daytime
15, // netstat
17, // qotd
19, // chargen
20, // ftp data
21, // ftp access
22, // ssh
23, // telnet
25, // smtp
37, // time
42, // name
43, // nicname
53, // domain
69, // tftp
77, // priv-rjs
79, // finger
87, // ttylink
95, // supdup
101, // hostriame
102, // iso-tsap
103, // gppitnp
104, // acr-nema
109, // pop2
110, // pop3
111, // sunrpc
113, // auth
115, // sftp
117, // uucp-path
119, // nntp
123, // NTP
135, // loc-srv /epmap
137, // netbios
139, // netbios
143, // imap2
161, // snmp
179, // BGP
389, // ldap
427, // SLP (Also used by Apple Filing Protocol)
465, // smtp+ssl
512, // print / exec
513, // login
514, // shell
515, // printer
526, // tempo
530, // courier
531, // chat
532, // netnews
540, // uucp
548, // AFP (Apple Filing Protocol)
554, // rtsp
556, // remotefs
563, // nntp+ssl
587, // smtp (rfc6409)
601, // syslog-conn (rfc3195)
636, // ldap+ssl
989, // ftps-data
990, // ftps
993, // ldap+ssl
995, // pop3+ssl
1719, // h323gatestat
1720, // h323hostcall
1723, // pptp
2049, // nfs
3659, // apple-sasl / PasswordServer
4045, // lockd
5060, // sip
5061, // sips
6000, // X11
6566, // sane-port
6665, // Alternate IRC [Apple addition]
6666, // Alternate IRC [Apple addition]
6667, // Standard IRC [Apple addition]
6668, // Alternate IRC [Apple addition]
6669, // Alternate IRC [Apple addition]
6697, // IRC + TLS
10080, // Amanda
];
/// Check out wether a port is a restricted port for major browsers
pub fn is_restricted_port(port: u16) -> bool {
RESTRICTED_PORTS.contains(&port)
}