A new fork of dave
david is a simple WebDAV server that provides the following features:
- Single binary that runs under Windows, Linux and OSX.
- Authentication via HTTP-Basic.
- CRUD operation permissions
- TLS support - if needed.
- A simple user management which allows user-directory-jails as well as full admin access to all subdirectories.
- Live config reload to allow editing of users without downtime.
- A cli tool to generate BCrypt password hashes.
It perfectly fits if you would like to give some people the possibility to upload, download or share files with common tools like the OSX Finder, Windows Explorer or Nautilus under Linux (or many other tools).
The project david is an extension from the project dave
- Clone the repository (or your fork)
git clone https://github.com/audstanley/david
Make sure to have Golang installed. than run:
cd cmd/david && go build . && mv ./david ~/go/bin/david
cd ../bcpt && go build . && mv bcpt ~/go/bin/bcpt && cd ../..
The configuration is done in form of a yaml file. david will scan the
following locations for the presence of a config.yaml
in the following
order:
- The directory
./config
- The directory
$HOME/.swd
(swd was the initial project name of david) - The directory
$HOME/.david
- The current working directory
.
Alternatively, the path to a configuration file can be specified on the command-line:
david --config /path/to/config.yaml
Here an example of a very simple but functional configuration:
address: "127.0.0.1" # the bind address
port: "8000" # the listening port
dir: "/home/myuser/webdav" # the provided base dir
prefix: "/webdav" # the url-prefix of the original url
users:
user: # with password 'foo' and jailed access to '/home/myuser/webdav/user'
password: "$2a$10$yITzSSNJZAdDZs8iVBQzkuZCzZ49PyjTiPIrmBUKUpB0pwX7eySvW"
subdir: "/user"
permissions: "r" # read only
admin: # with password 'foo' and access to '/home/myuser/webdav'
password: "$2a$10$DaWhagZaxWnWAOXY0a55.eaYccgtMOL3lGlqI3spqIBGyM0MD.EN6"
permissions: "crud"
With this configuration you'll grant access for two users and the WebDAV
server is available under http://127.0.0.1:8000/webdav
.
At first, use your favorite toolchain to obtain a SSL certificate and keyfile (if you don't already have some).
Here an example with openssl
:
# Generate a keypair
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
# Remove the passphrase from the key file
openssl rsa -in key.pem -out clean_key.pem
Now you can reference your keypair in the configuration via:
address: "127.0.0.1" # the bind address
port: "8000" # the listening port
dir: "/home/myuser/webdav" # the provided base directory
tls:
keyFile: clean_key.pem
certFile: cert.pem
users:
...
The presence of the tls
section is completely enough to let the server
start with a TLS secured HTTPS connection.
In the current release version you must take care, that the private key doesn't need a passphrase. Otherwise starting the server will fail.
In case you intend to operate this server from a web browser based application, you might need to allow CORS access. To achieve that, you can configure the host you want to grant access to:
cors:
origin: "*" # the origin to allow, or '*' for all
credentials: true # whether to allow credentials via CORS
Note however that this has security implications, so be careful in production environments.
david will also work behind a reverse proxy. Here is an example
configuration with apache2 httpd
's mod_proxy
:
<Location /webdav>
ProxyPass https://webdav-host:8000/
ProxyPassReverse https://webdav-host:8000/
</Location>
Here is an example of david using a json caddyfile for a reverse proxy:
{
"admin": {
"disabled": false,
"listen": "0.0.0.0:2019",
"enforce_origin": false,
"origins": [
"127.0.0.1"
],
"config": {
"persist": false
}
},
"apps": {
"http": {
"servers": {
"MyServers": {
"listen": [
":443"
],
"routes": [
{
"match": [
{
"host": [
"files.example.com"
]
}
],
"handle": [
{
"handler": "reverse_proxy",
"upstreams": [
{
"dial": ":8000"
}
]
}
]
}
]
}
}
}
}
}
User management in david is very simple, but optional. You don't have to add users if it's not
necessary for your use case. But if you do, each user in the config.yaml
must have a
password and can have a subdirectory.
The password must be in form of a BCrypt hash. You can generate one calling the shipped cli
tool bcpt passwd
.
If a subdirectory is configured for a user, the user is jailed within it and can't see anything that exists outside of this directory. If no subdirectory is configured for an user, the user can see and modify all files within the base directory.
You can enable / disable logging for the following operations:
- Creation of files or directories
- Reading of files or directories
- Updating of files or directories
- Deletion of files or directories
You can also enable or disable the error log.
All file-operation logs are disabled per default until you will turn it on via the following config entries:
log:
production: true # All logs will be in NDJSON format. If set to false, than after parsing the config file, the logging mode will be set to TEXT
debug: true
error: true
create: true
read: true
update: true
delete: true
...
Be aware, that the log pattern of an attached tty differs from the log pattern of a detached tty.
Example of an attached tty:
INFO[0000] Server is starting and listening address=0.0.0.0 port=8000 security=none
Example of a detached tty:
time="2018-04-14T20:46:00+02:00" level=info msg="Server is starting and listening" address=0.0.0.0 port=8000 security=none
There is no need to restart the server itself, if you're editing the user or log section of the configuration. The config file will be re-read and the application will update it's own configuration silently in background.
You could simply connect to the WebDAV server with an HTTP(S) connection and a tool that allows the WebDAV protocol.
For example: Under OSX you can use the default file management tool Finder. Press CMD+K,
enter the server address (e.g. http://localhost:8000
) and choose connect.
Everyone is welcome to create pull requests for this project. If you're new to github, take a look here to get an idea of it.
If you've got an idea of a function that should find it's way into this project, but you won't implement it by yourself, please create a new issue.
Windows 11 is not going to let you map the network drive with a self signed certificate or no running david with no certificate (at all). Consider using Caddy, or use Cyberduck - which will let you connect with a self signed certificate. There might be a way around this by editing a windows register, but I don't recommend that. Just use Cyberduck, or try out Cybermount. The easiest option is a reverse proxy running Caddy, in my honest opinion. Caddy v2 will sign the certificate, and you can run david with no TLS needed since Caddy is handling the encryption over the internet.
Please be aware of the licenses of the components we use in this project. Everything else that has been developed by the contributions to this project is under the Apache 2 License.