93 lines
2.3 KiB
Go
93 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"git.makerforce.io/photos/photos/internal/httphelpers"
|
|
lib "git.makerforce.io/photos/photos/pkg/bucket"
|
|
"git.makerforce.io/photos/photos/pkg/credentials"
|
|
"git.makerforce.io/photos/photos/pkg/signer"
|
|
)
|
|
|
|
var creds *credentials.Client
|
|
var sig *signer.Signer
|
|
|
|
func main() {
|
|
var err error
|
|
// Setup bucket credential source
|
|
creds, err = credentials.NewClientFromEnv()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
// Setup bucket signer
|
|
sig, err = signer.NewSignerFromEnv()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
server := &http.Server{
|
|
Addr: ":8000",
|
|
ReadTimeout: 5 * time.Second,
|
|
WriteTimeout: 10 * time.Second,
|
|
}
|
|
http.HandleFunc("/sign", sign)
|
|
err = server.ListenAndServe()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func sign(w http.ResponseWriter, req *http.Request) {
|
|
var err error
|
|
|
|
bucket := lib.Bucket(req.FormValue("bucket"))
|
|
token := req.FormValue("token")
|
|
request := SafePathable(req.FormValue("request"))
|
|
|
|
err = bucket.Validate()
|
|
if err != nil {
|
|
err := fmt.Errorf("%w: %v", httphelpers.ErrorBadRequest, err.Error())
|
|
httphelpers.ErrorResponse(w, err)
|
|
return
|
|
}
|
|
err = request.Validate()
|
|
if err != nil {
|
|
err := fmt.Errorf("%w: %v", httphelpers.ErrorBadRequest, err.Error())
|
|
httphelpers.ErrorResponse(w, err)
|
|
return
|
|
}
|
|
|
|
var cred credentials.Credential
|
|
if token == "todo" {
|
|
cred, err = creds.Get(bucket)
|
|
if err != nil {
|
|
err := fmt.Errorf("%w: error getting credentials: %v", httphelpers.ErrorBadRequest, err.Error())
|
|
httphelpers.ErrorResponse(w, err)
|
|
return
|
|
}
|
|
}
|
|
|
|
var signedReq *http.Request
|
|
unsignedReq, err := http.NewRequest(req.Method, bucket.URL(request).String(), nil)
|
|
if err != nil {
|
|
err := fmt.Errorf("%w: error creating request: %v", httphelpers.ErrorBadRequest, err.Error())
|
|
httphelpers.ErrorResponse(w, err)
|
|
return
|
|
}
|
|
|
|
if req.Method == http.MethodGet {
|
|
signedReq = sig.PreSignRead(unsignedReq, cred)
|
|
} else if req.Method == http.MethodPost || req.Method == http.MethodPut || req.Method == http.MethodDelete {
|
|
signedReq = sig.PreSignRead(unsignedReq, cred)
|
|
} else {
|
|
err := fmt.Errorf("%w: %v", httphelpers.ErrorMethodNotAllowed, req.Method)
|
|
httphelpers.ErrorResponse(w, err)
|
|
return
|
|
}
|
|
|
|
w.Header().Add("Location", signedReq.URL.String())
|
|
w.WriteHeader(http.StatusTemporaryRedirect)
|
|
}
|