mirror of
https://github.com/rclone/rclone.git
synced 2026-11-08 02:32:57 -05: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.
(cherry picked from commit 2e9c06c84d)
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)
|
|
}
|
|
}
|