Open a WebDAV server as a folder under the signature plugin (#1)

Co-authored-by: Danny Kim <temeddix@gmail.com>
Co-committed-by: Danny Kim <temeddix@gmail.com>
This commit was merged in pull request #1.
This commit is contained in:
Danny Kim
2026-09-25 16:54:15 +00:00
committed by temeddix
parent 5d591b2fb0
commit a4d1fae1d3
12 changed files with 1563 additions and 4 deletions
+65 -4
View File
@@ -1,7 +1,68 @@
# Memona signature plugin
Opens a WebDAV server as a folder inside Memona and signs every Markdown file
saved to it with an ENS name, writing `signer` and `signature` into the file's
frontmatter so anyone can check who wrote it against the name's current ENSv2
records. Signing and verification come from the
Opens a WebDAV server as a folder inside Memona. It is the foundation for
signing Markdown files with an ENS name as they are saved, writing `signer` and
`signature` into each file's frontmatter so anyone can check who wrote it
against the name's current ENSv2 records, using the
[md-ens-signature](https://github.com/capsulizers/md-ens-signature) library.
This version is the WebDAV folder alone; signing is not in it yet.
The plugin is a WASI component: it speaks no sockets of its own and makes every
request through the host's HTTP interface, under the connection's permissions.
It registers one provider, `signature`, for the `signed-webdav` scheme.
## Connecting
| Field | Meaning |
| --- | --- |
| Server address | The folder's address, for example `https://dav.example.com/files/` |
| Username | Optional account name for HTTP basic authentication |
| Password | Optional password, stored as a secret |
Listing, reading, writing, creating directories, renaming and deleting behave
as in the WebDAV plugin: reads and writes stream in pieces of at most 1 MiB,
conditional writes use `If-Match` and `If-None-Match`, change polling is not
supported, a rename never replaces an existing target, and a folder with
contents is refused rather than removed whole.
## Building
```sh
rustup target add wasm32-wasip2
cargo build --locked --release --target wasm32-wasip2
cargo test --locked --lib
```
The component lands at
`target/wasm32-wasip2/release/memona_plugin_signature.wasm`.
`wit/filesystem.wit` is a copy of the canonical Memona filesystem contract, and
`src/sdk.rs` generates the guest bindings from it, so this repository builds
without a Memona checkout. Refresh the copy from `plugin_system/sdk/wit` in the
[Memona repository](https://git.capsulizers.com/lead/memona) when the contract
moves, and keep `apiVersion` in `manifest.json` in step.
## Packaging for the plugin store
A `.memona-plugin` package is a ZIP archive with the files at its root, never
inside a directory:
```sh
cargo build --locked --release --target wasm32-wasip2
cp target/wasm32-wasip2/release/memona_plugin_signature.wasm plugin.wasm
zip memona-plugin-signature.memona-plugin \
manifest.json plugin.wasm README.md LICENSE
```
`manifest.json` and `plugin.wasm` are required; `README.md` becomes the guide on
the plugin's public page and `LICENSE` is shown beside it.
## Attribution
The WebDAV code in `src/lib.rs`, `src/dav.rs` and `src/sdk.rs` is copied from
the MIT-licensed
[Memona WebDAV plugin](https://git.capsulizers.com/commons/memona-plugin-webdav)
at commit `3d69750`. That crate keeps its provider, reader and writer private
and exports the component's entry points itself, so it cannot be wrapped as a
dependency without forking it; the copy stays as close to the original as the
signing hook allows, so fixes there carry over with a plain diff.