Remove host allowlists from WebDAV plugin setup
CI / checks (pull_request) Successful in 1m17s
Agents / bot (pull_request) Successful in 4m16s

This commit is contained in:
Danny Kim
2026-09-30 17:46:44 +09:00
parent d945b5280f
commit 631ea9db65
3 changed files with 15 additions and 19 deletions
+4 -7
View File
@@ -7,6 +7,8 @@ interface, under the connection's permissions.
It registers one provider, `webdav`, for the `webdav` and `davs` schemes. It registers one provider, `webdav`, for the `webdav` and `davs` schemes.
This package requires a Memona version that supports plugin manifest schema 2.
## Connecting ## Connecting
| Field | Meaning | | Field | Meaning |
@@ -15,13 +17,8 @@ It registers one provider, `webdav`, for the `webdav` and `davs` schemes.
| Username | Optional account name for HTTP basic authentication | | Username | Optional account name for HTTP basic authentication |
| Password | Optional password, stored as a secret | | Password | Optional password, stored as a secret |
In Memona's connection permissions, enter the server's hostname or IP in For localhost or a server on a private network, turn on **Private network** in
**Allowed hosts**, without the URL scheme, port or path. For example, the connection settings. Save and reconnect after changing these settings.
`http://192.168.1.20:8080/dav/` needs `192.168.1.20`. An empty list blocks every
request, even when the address and credentials are correct. Turn on
**Private network** as well for a server on localhost or a private network;
this switch does not grant a host by itself. Save and reconnect after changing
these permissions.
Listing, reading, writing, creating directories, renaming and deleting are Listing, reading, writing, creating directories, renaming and deleting are
supported. Reads and writes stream in pieces of at most 1 MiB, so a file of any supported. Reads and writes stream in pieces of at most 1 MiB, so a file of any
+1 -2
View File
@@ -1,5 +1,5 @@
{ {
"schemaVersion": 1, "schemaVersion": 2,
"id": "memona/webdav", "id": "memona/webdav",
"name": "WebDAV", "name": "WebDAV",
"version": "0.1.2", "version": "0.1.2",
@@ -7,7 +7,6 @@
"description": "Open a WebDAV server as a folder, and let agents work in it.", "description": "Open a WebDAV server as a folder, and let agents work in it.",
"license": "MIT", "license": "MIT",
"entry": "plugin.wasm", "entry": "plugin.wasm",
"networkHosts": ["*"],
"networkPorts": [], "networkPorts": [],
"providers": [ "providers": [
{ {
+10 -10
View File
@@ -35,10 +35,10 @@ interface host {
/// `respond`. An empty result means the body is complete. /// `respond`. An empty result means the body is complete.
pull: func(limit: u32) -> result<list<u8>, host-error>; pull: func(limit: u32) -> result<list<u8>, host-error>;
} }
/// Begins a request to a host both declared by the package and granted on /// Begins a request to any public HTTP or HTTPS host. Each redirect and
/// the connection. Each redirect and DNS result is checked, and DNS is /// DNS result is checked, and DNS is pinned. Private/LAN addresses require
/// pinned. Private/LAN addresses additionally require the private-network /// the connection's private-network grant. Cross-origin redirects remove
/// grant. Cross-origin redirects remove request headers; HTTPS cannot /// request headers; HTTPS cannot
/// downgrade. The host bounds total bytes per exchange, not buffer size. /// downgrade. The host bounds total bytes per exchange, not buffer size.
http: func(request: request) -> result<exchange, host-error>; http: func(request: request) -> result<exchange, host-error>;
@@ -51,13 +51,13 @@ interface host {
/// Writes at most 1,048,576 bytes and returns how many were accepted. /// Writes at most 1,048,576 bytes and returns how many were accepted.
write: func(data: list<u8>) -> result<u32, host-error>; write: func(data: list<u8>) -> result<u32, host-error>;
} }
/// Opens a socket to a host and port both declared by the package and /// Opens a socket to any public host on a package-declared port.
/// granted on the connection. The host resolves and pins DNS, applies the /// The host resolves and pins DNS, applies the same private-address rule
/// same private-address rule as `http`, and starts TLS when asked. Ports /// as `http`, and starts TLS when asked. Ports
/// negotiated at runtime, such as an FTP data channel, still need a grant. /// negotiated at runtime, such as an FTP data channel, must be declared.
connect: func(host: string, port: u16, tls: bool) -> result<tcp, host-error>; connect: func(host: string, port: u16, tls: bool) -> result<tcp, host-error>;
/// One datagram socket connected to a single granted peer. /// One datagram socket connected to a single peer.
resource udp { resource udp {
/// Sends one datagram of at most 65,507 bytes. /// Sends one datagram of at most 65,507 bytes.
send: func(data: list<u8>) -> result<u32, host-error>; send: func(data: list<u8>) -> result<u32, host-error>;
@@ -65,7 +65,7 @@ interface host {
/// means none arrived inside the host's wait, not that the peer left. /// means none arrived inside the host's wait, not that the peer left.
receive: func(limit: u32) -> result<list<u8>, host-error>; receive: func(limit: u32) -> result<list<u8>, host-error>;
} }
/// Connects a datagram socket under the same declaration and grant rules /// Connects a datagram socket under the same port and private-network rules
/// as `connect`, for the few filesystem protocols that still need one. /// as `connect`, for the few filesystem protocols that still need one.
bind: func(host: string, port: u16) -> result<udp, host-error>; bind: func(host: string, port: u16) -> result<udp, host-error>;