mirror of
https://github.com/rclone/rclone.git
synced 2026-10-10 15:01:37 -04:00
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.
71 lines
1.6 KiB
Go
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)
|
|
}
|
|
}
|