eberkheev a0c996b19d refactor(server): extract helpers and simplify auth dispatch
- Move `sha256_hex` and cookie constants to module level; drop `token_is_hash` param in favour of regex auto-detection
- Make `_respond()` accept `status`/`headers`; add `_redirect()` helper to eliminate boilerplate in auth routes
- Simplify `_dispatch()` with a `PUBLIC_ROUTES` set and positive-logic early-return
- Restrict CORS header to file API; auth responses no longer send `Access-Control-Allow-Origin: *`
- Extract `clearPager()` in frontend and deduplicate `copyText` fallback path
2026-07-29 18:08:36 +04:00

Share

Local network file sharing via web page. Drag & drop, Ctrl+V paste, download.

No dependencies — Python 3 stdlib only.

Setting this up on a new machine? See SETUP.md.

Quick start

./install.sh          # generates a token, installs + starts the systemd service

Or run it in the foreground without installing anything:

cp share.config.example share.config    # then set `token` in it
python3 share.py

Open https://localhost:3001 in a browser. The network address is printed at startup. The cert is self-signed, so expect a browser warning on first visit.

Options

CLI flags override share.config.

python3 share.py -p 3001 -d ~/Downloads/shared --ttl 7
Flag Default Description
-p, --port 3001 Port
-d, --dir ~/Downloads/shared Upload directory
--ttl 7 File lifetime in days (0 = keep forever)
--token Auth token (empty = open access)
--cert Path to SSL certificate
--key Path to SSL key

Authentication

Set token in share.config or pass --token. All endpoints require a valid token. An empty token means open access to everyone on the network.

The token is accepted as an Authorization: Bearer header or the share_token cookie set by the login page. A ?token= link works only on / — it is exchanged for the cookie and redirected away so the secret does not linger in the URL.

share.config is gitignored because it holds the secret — share.config.example is the tracked template.

The token can be stored as plain text or as a SHA-256 hash:

# generate hash
python3 share.py hash mytoken

# store in share.config
token = 9c56cc51b374c3ba189210d5b6d0d04...

If the value is a 64-character hex string, it is treated as a hash. Otherwise it is hashed automatically at startup.

systemd (Arch)

Installed by ./install.sh from share.service.template to ~/.config/systemd/user/share.service. Restart after editing share.config — it is only read at startup.

systemctl --user enable --now share    # start + autostart
systemctl --user restart share         # restart
systemctl --user stop share            # stop
journalctl --user -u share -f          # logs

Features

  • Drag & drop files onto the page
  • Ctrl+V to paste images / files from clipboard
  • Click the drop zone to open file picker
  • Upload progress bar
  • File list with download and delete
  • Auto-cleanup of old files (configurable via --ttl)
S
Description
Веб-сервис обмена файлами по локальной сети с drag-and-drop и автоочисткой
Readme
147 KiB
Languages
HTML 43.3%
Python 42.5%
Shell 14.2%