48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package tunnelserver
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/rancher/remotedialer"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
type Authorizers struct {
|
|
chain []remotedialer.Authorizer
|
|
}
|
|
|
|
func ErrorWriter(rw http.ResponseWriter, req *http.Request, code int, err error) {
|
|
fullAddress := req.RemoteAddr
|
|
forwardedFor := req.Header.Get("X-Forwarded-For")
|
|
if forwardedFor != "" {
|
|
fullAddress = fmt.Sprintf("%s (X-Forwarded-For: %s)", req.RemoteAddr, forwardedFor)
|
|
}
|
|
logrus.Errorf("Failed to handle tunnel request from remote address %s: response %d: %v", fullAddress, code, err)
|
|
logrus.Tracef("ErrorWriter: response code: %d, request: %v", code, req)
|
|
remotedialer.DefaultErrorWriter(rw, req, code, err)
|
|
}
|
|
|
|
func (a *Authorizers) Authorize(req *http.Request) (clientKey string, authed bool, err error) {
|
|
var (
|
|
firstErr error
|
|
)
|
|
|
|
for _, auth := range a.chain {
|
|
key, authed, err := auth(req)
|
|
if err != nil || !authed {
|
|
if firstErr == nil {
|
|
firstErr = err
|
|
}
|
|
continue
|
|
}
|
|
return key, authed, err
|
|
}
|
|
|
|
return "", false, firstErr
|
|
}
|
|
|
|
func (a *Authorizers) Add(authorizer remotedialer.Authorizer) {
|
|
a.chain = append(a.chain, authorizer)
|
|
}
|