Files
rclone/cmd/serve/proxy/proxy_code.go
T
Nick Craig-Wood 2e9c06c84d serve: fix --auth-proxy backends never being shut down after simultaneous logins
With --auth-proxy, when several logins with the same credentials
arrived together and none was in the cache yet, as when an FTP client
opens several connections at once, each one ran the auth proxy program
and took its own reference to the backend. Only one of them was
remembered, so the others were never given back and the backend was
never shut down.

Logins which arrive together now share one run of the auth proxy
program and one reference to the backend.
2026-10-08 10:36:00 +01:00

71 lines
1.6 KiB
Go

//go:build ignore
// A simple auth proxy for testing purposes
package main
import (
"encoding/json"
"log"
"os"
)
func main() {
// Read the input
var in map[string]string
err := json.NewDecoder(os.Stdin).Decode(&in)
if err != nil {
log.Fatal(err)
}
// Note each run in a file if asked to
if runLog := os.Getenv("RCLONE_TEST_PROXY_RUN_LOG"); runLog != "" {
f, err := os.OpenFile(runLog, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600)
if err != nil {
log.Fatal(err)
}
_, _ = f.WriteString(in["user"] + "\n")
_ = f.Close()
}
// Write the output
var out = map[string]string{}
for k, v := range in {
switch k {
case "user":
v += "-test"
case "error":
log.Fatal(v)
}
out[k] = v
}
if out["type"] == "" {
out["type"] = "local"
}
if out["_root"] == "" {
out["_root"] = ""
}
// S3 access key auth has neither pass nor public_key and needs
// the secret returned, unless the user asks for it to be omitted
// or empty. The secret's suffix can be changed to simulate a
// rotation and an access key ID can be revoked.
_, havePass := in["pass"]
_, havePublicKey := in["public_key"]
switch {
case havePass || havePublicKey || in["user"] == "nosecret":
case in["user"] == os.Getenv("RCLONE_TEST_PROXY_REVOKED"):
log.Fatalf("access key ID %q revoked", in["user"])
case in["user"] == "emptysecret":
out["_secret_access_key"] = ""
default:
suffix := os.Getenv("RCLONE_TEST_PROXY_SECRET_SUFFIX")
if suffix == "" {
suffix = "-secret"
}
out["_secret_access_key"] = in["user"] + suffix
}
json.NewEncoder(os.Stdout).Encode(&out)
if err != nil {
log.Fatal(err)
}
}