From cd885fa2f65f90ae6d2d8df1afb5e74cfa214855 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期日, 26 五月 2024 20:19:26 +0800
Subject: [PATCH] 添加A2梯控的接收端

---
 pkg/auth/auth.go |  110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 110 insertions(+), 0 deletions(-)

diff --git a/pkg/auth/auth.go b/pkg/auth/auth.go
new file mode 100644
index 0000000..bbe5a12
--- /dev/null
+++ b/pkg/auth/auth.go
@@ -0,0 +1,110 @@
+// Package auth is an implementation of HTTP Basic and HTTP Digest authentication.
+package auth
+
+import (
+	"context"
+	"net/http"
+)
+
+// AuthenticatedRequest is passed to AuthenticatedHandlerFunc instead
+// of *http.Request.
+type AuthenticatedRequest struct {
+	http.Request
+	// Username is the authenticated user name. Current API implies that
+	// Username is never empty, which means that authentication is
+	// always done before calling the request handler.
+	Username string
+}
+
+// AuthenticatedHandlerFunc is like http.HandlerFunc, but takes
+// AuthenticatedRequest instead of http.Request
+type AuthenticatedHandlerFunc func(http.ResponseWriter, *AuthenticatedRequest)
+
+// Authenticator wraps an AuthenticatedHandlerFunc with
+// authentication-checking code.
+//
+// Typical Authenticator usage is something like:
+//
+//   authenticator := SomeAuthenticator(...)
+//   http.HandleFunc("/", authenticator(my_handler))
+//
+// Authenticator wrapper checks the user authentication and calls the
+// wrapped function only after authentication has succeeded. Otherwise,
+// it returns a handler which initiates the authentication procedure.
+type Authenticator func(AuthenticatedHandlerFunc) http.HandlerFunc
+
+// Info contains authentication information for the request.
+type Info struct {
+	// Authenticated is set to true when request was authenticated
+	// successfully, i.e. username and password passed in request did
+	// pass the check.
+	Authenticated bool
+
+	// Username contains a user name passed in the request when
+	// Authenticated is true. It's value is undefined if Authenticated
+	// is false.
+	Username string
+
+	// ResponseHeaders contains extra headers that must be set by server
+	// when sending back HTTP response.
+	ResponseHeaders http.Header
+}
+
+// UpdateHeaders updates headers with this Info's ResponseHeaders. It is
+// safe to call this function on nil Info.
+func (i *Info) UpdateHeaders(headers http.Header) {
+	if i == nil {
+		return
+	}
+	for k, values := range i.ResponseHeaders {
+		for _, v := range values {
+			headers.Add(k, v)
+		}
+	}
+}
+
+type key int // used for context keys
+
+var infoKey key
+
+// AuthenticatorInterface is the interface implemented by BasicAuth
+// and DigestAuth authenticators.
+//
+// Deprecated: this interface is not coherent. New code should define
+// and use your own interfaces with a required subset of authenticator
+// methods.
+type AuthenticatorInterface interface {
+	// NewContext returns a new context carrying authentication
+	// information extracted from the request.
+	NewContext(ctx context.Context, r *http.Request) context.Context
+
+	// Wrap returns an http.HandlerFunc which wraps
+	// AuthenticatedHandlerFunc with this authenticator's
+	// authentication checks.
+	Wrap(AuthenticatedHandlerFunc) http.HandlerFunc
+}
+
+// FromContext returns authentication information from the context or
+// nil if no such information present.
+func FromContext(ctx context.Context) *Info {
+	info, ok := ctx.Value(infoKey).(*Info)
+	if !ok {
+		return nil
+	}
+	return info
+}
+
+// AuthUsernameHeader is the header set by JustCheck functions. It
+// contains an authenticated username (if authentication was
+// successful).
+const AuthUsernameHeader = "X-Authenticated-Username"
+
+// JustCheck returns a new http.HandlerFunc, which requires
+// authenticator to successfully authenticate a user before calling
+// wrapped http.HandlerFunc.
+func JustCheck(auth AuthenticatorInterface, wrapped http.HandlerFunc) http.HandlerFunc {
+	return auth.Wrap(func(w http.ResponseWriter, ar *AuthenticatedRequest) {
+		ar.Header.Set(AuthUsernameHeader, ar.Username)
+		wrapped(w, &ar.Request)
+	})
+}

--
Gitblit v1.8.0