Skip to content

Commit 175f76c

Browse files
committed
tls windows
1 parent df25f24 commit 175f76c

File tree

5 files changed

+57
-16
lines changed

5 files changed

+57
-16
lines changed

Cargo.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,12 @@ url = "2.2.2"
7777
webdav-handler = { path = "webdav-handler-rs", version = "=0.2.0" }
7878
#webdav-handler = "0.2.0"
7979
pwhash = "1.0.0"
80+
tls-listener = { version = "0.5.1", features = [ "hyper-h1", "hyper-h2", "rustls" ] }
81+
tokio-rustls = "0.23.4"
82+
winapi = {version = "0.3.9", features = [ "impl-default"] }
8083

8184
[target.'cfg(not(windows))'.dependencies]
8285
fs-quota = { path = "fs_quota", version = "0.1.0", optional = true }
8386
pam-sandboxed = { path = "pam", version = "0.2.0", optional = true }
84-
tls-listener = { version = "0.5.1", features = [ "hyper-h1", "hyper-h2", "rustls" ] }
85-
tokio-rustls = "0.23.4"
87+
8688

fs_quota/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ impl FsQuota {
127127
return Err(FqError::IoError(io::Error::last_os_error()));
128128
}
129129
Ok(FsQuota {
130-
bytes_used: ((vfs.f_blocks - vfs.f_bfree) * vfs.f_frsize) as u64,
131-
bytes_limit: Some(((vfs.f_blocks - (vfs.f_bfree - vfs.f_bavail)) * vfs.f_frsize) as u64),
130+
bytes_used: ((vfs.f_blocks - vfs.f_bfree) as u64 * vfs.f_frsize) as u64,
131+
bytes_limit: Some(((vfs.f_blocks - (vfs.f_bfree - vfs.f_bavail)) as u64 * vfs.f_frsize) as u64),
132132
files_used: (vfs.f_files - vfs.f_ffree) as u64,
133133
files_limit: Some((vfs.f_files - (vfs.f_ffree - vfs.f_favail)) as u64),
134134
})

src/main.rs

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ mod userfs;
2828
use std::convert::TryFrom;
2929
use std::io;
3030
use std::net::{SocketAddr, ToSocketAddrs};
31-
#[cfg(all(not(windows), feature = "tls"))]
31+
#[cfg(all(not(windows), feature ="tls"))]
3232
use std::os::unix::io::{FromRawFd, AsRawFd};
33+
#[cfg(all(windows, feature ="tls"))]
34+
use std::os::windows::prelude::{AsRawSocket, FromRawSocket};
3335
use std::process::exit;
3436
use std::sync::Arc;
3537

@@ -41,9 +43,10 @@ use hyper::{
4143
server::conn::{AddrIncoming, AddrStream},
4244
service::{make_service_fn, service_fn},
4345
};
44-
#[cfg(all(not(windows), feature = "tls"))]
46+
#[cfg(feature = "tls")]
4547
use tls_listener::TlsListener;
46-
#[cfg(all(not(windows), feature = "tls"))]
48+
use tokio::time::error::Elapsed;
49+
#[cfg(feature = "tls")]
4750
use tokio_rustls::server::TlsStream;
4851
use webdav_handler::{davpath::DavPath, DavConfig, DavHandler, DavMethod, DavMethodSet};
4952
use webdav_handler::{fakels::FakeLs, fs::DavFileSystem, ls::DavLockSystem};
@@ -52,7 +55,7 @@ use crate::config::{AcctType, Auth, CaseInsensitive, Handler, Location, OnNotfou
5255
use crate::rootfs::RootFs;
5356
use crate::router::MatchedRoute;
5457
use crate::suid::proc_switch_ugid;
55-
#[cfg(all(not(windows), feature = "tls"))]
58+
#[cfg(feature = "tls")]
5659
use crate::tls::tls_acceptor;
5760
use crate::userfs::UserFs;
5861

@@ -463,7 +466,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
463466
// build servers (one for each listen address).
464467
let dav_server = Server::new(config.clone(), auth);
465468
let mut servers = Vec::new();
466-
#[cfg(all(not(windows), feature = "tls"))]
469+
#[cfg(feature = "tls")]
467470
let mut tls_servers = Vec::new();
468471

469472
// Plaintext servers.
@@ -499,7 +502,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
499502
});
500503
}
501504

502-
#[cfg(all(not(windows), feature = "tls"))]
505+
#[cfg(feature = "tls")]
503506
// TLS servers.
504507
if tls_addrs.len() > 0 {
505508
let tls_acceptor = tls_acceptor(&config.server)?;
@@ -527,22 +530,52 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
527530
// we run it in a loop. Every time the loop is entered we dup() the
528531
// listening fd and create a new TcpListener. This way, we should
529532
// not lose any pending connections during a restart.
533+
#[cfg(not(windows))]
530534
let master_listen_fd = listener.as_raw_fd();
535+
#[cfg(windows)]
536+
let master_listen_fd = listener.as_raw_socket();
531537
std::mem::forget(listener);
532-
533538
println!("Listening on https://{:?}", sockaddr);
534539
tls_servers.push(async move {
535540
loop {
536541
// reuse the incoming socket after the server exits.
542+
#[cfg(not(windows))]
537543
let listen_fd = match nix::unistd::dup(master_listen_fd) {
538544
Ok(fd) => fd,
539545
Err(e) => {
540546
eprintln!("{}: server error: dup: {}", PROGNAME, e);
541547
break;
542548
}
543549
};
550+
#[cfg(windows)]
551+
let listen_fd = {
552+
let mut infoW= winapi::um::winsock2::WSAPROTOCOL_INFOW{..Default::default()}; // = Default::default();
553+
let error = unsafe { winapi::um::winsock2::WSADuplicateSocketW(master_listen_fd as usize,
554+
winapi::um::processthreadsapi::GetCurrentProcessId(),
555+
&mut infoW) };
556+
if error != 0 {
557+
// let error = unsafe { winapi::um::errhandlingapi::GetLastError() };
558+
eprintln!("{}: WSADuplicateSocketW error", PROGNAME);
559+
break;
560+
}
561+
let listen_fd = unsafe { winapi::um::winsock2::WSASocketW(
562+
winapi::shared::ws2def::AF_INET,
563+
winapi::shared::ws2def::SOCK_STREAM,
564+
winapi::shared::ws2def::IPPROTO_TCP as i32,
565+
&mut infoW,
566+
0,
567+
0) };
568+
if listen_fd == winapi::um::winsock2::INVALID_SOCKET {
569+
eprintln!("{}: Socket Duplicate error", PROGNAME);
570+
break;
571+
}
572+
listen_fd
573+
};
544574
// SAFETY: listen_fd is unique (we just dup'ed it).
575+
#[cfg(not(windows))]
545576
let std_listen = unsafe { std::net::TcpListener::from_raw_fd(listen_fd) };
577+
#[cfg(windows)]
578+
let std_listen = unsafe { std::net::TcpListener::from_raw_socket(listen_fd as u64) };
546579
let listener = match tokio::net::TcpListener::from_std(std_listen) {
547580
Ok(l) => l,
548581
Err(e) => {
@@ -588,7 +621,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
588621
for server in servers.drain(..) {
589622
tasks.push(tokio::spawn(server));
590623
}
591-
#[cfg(all(not(windows), feature = "tls"))]
624+
#[cfg(feature = "tls")]
592625
for server in tls_servers.drain(..) {
593626
tasks.push(tokio::spawn(server));
594627
}

src/tls.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ use std::fs::File;
22
use std::io::{self, ErrorKind};
33
use std::sync::Arc;
44

5-
#[cfg(all(not(windows), feature = "tls"))]
5+
#[cfg(feature = "tls")]
66
use tokio_rustls::rustls::{Certificate, PrivateKey, ServerConfig};
7-
#[cfg(all(not(windows), feature = "tls"))]
7+
#[cfg(feature = "tls")]
88
use tokio_rustls::TlsAcceptor;
9-
#[cfg(all(not(windows), feature = "tls"))]
9+
#[cfg(feature = "tls")]
1010
use rustls_pemfile as pemfile;
1111

1212
use crate::config::Server;
1313

14-
#[cfg(all(not(windows), feature = "tls"))]
14+
#[cfg(feature = "tls")]
1515
pub fn tls_acceptor(cfg: &Server) -> io::Result<TlsAcceptor> {
1616

1717
// Private key.

webdav-windows.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
# HTTP Port(s) to listen on.
66
# (https not implemented yet - use a frontend proxy like nginx)
77
listen = [ "0.0.0.0:4918", "[::]:4918" ]
8+
9+
# Tls config.
10+
tls_listen = [ "0.0.0.0:443", "[::]:443" ]
11+
tls_cert = "ssl.cert"
12+
tls_key = "ssl.key"
13+
814
# Unix uid/gid to run under (when not running setuid as user).
915
# Optional - if not set, will not change uid.
1016
# uid = 33

0 commit comments

Comments
 (0)