refactor: 更新项目引用路径从perfect-panel/ppanel-server到perfect-panel/server
feat: 添加版本和构建时间变量 fix: 修正短信队列类型注释错误 style: 清理未使用的代码和测试文件 docs: 更新安装文档中的下载链接 chore: 迁移数据库脚本添加日志和订阅配置
This commit is contained in:
@@ -5,17 +5,17 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/constant"
|
||||
"github.com/perfect-panel/server/pkg/constant"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/logger"
|
||||
"github.com/perfect-panel/server/pkg/logger"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/perfect-panel/ppanel-server/internal/config"
|
||||
"github.com/perfect-panel/ppanel-server/internal/svc"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/jwt"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/result"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/tool"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/xerr"
|
||||
"github.com/perfect-panel/server/internal/config"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
"github.com/perfect-panel/server/pkg/jwt"
|
||||
"github.com/perfect-panel/server/pkg/result"
|
||||
"github.com/perfect-panel/server/pkg/tool"
|
||||
"github.com/perfect-panel/server/pkg/xerr"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
@@ -40,6 +40,11 @@ func AuthMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
|
||||
loginType := ""
|
||||
if claims["LoginType"] != nil {
|
||||
loginType = claims["LoginType"].(string)
|
||||
}
|
||||
// get user id from token
|
||||
userId := int64(claims["UserId"].(float64))
|
||||
// get session id from token
|
||||
@@ -77,6 +82,7 @@ func AuthMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
ctx = context.WithValue(ctx, constant.LoginType, loginType)
|
||||
ctx = context.WithValue(ctx, constant.CtxKeyUser, userInfo)
|
||||
ctx = context.WithValue(ctx, constant.CtxKeySessionID, sessionId)
|
||||
c.Request = c.Request.WithContext(ctx)
|
||||
|
||||
@@ -3,6 +3,7 @@ package middleware
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -10,29 +11,40 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/logger"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/result"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/xerr"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
pkgaes "github.com/perfect-panel/server/pkg/aes"
|
||||
"github.com/perfect-panel/server/pkg/constant"
|
||||
"github.com/perfect-panel/server/pkg/result"
|
||||
"github.com/perfect-panel/server/pkg/xerr"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/perfect-panel/ppanel-server/internal/svc"
|
||||
pkgaes "github.com/perfect-panel/ppanel-server/pkg/aes"
|
||||
)
|
||||
|
||||
const (
|
||||
noWritten = -1
|
||||
defaultStatus = http.StatusOK
|
||||
key = "123456"
|
||||
)
|
||||
|
||||
func AppMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
|
||||
func DeviceMiddleware(srvCtx *svc.ServiceContext) func(c *gin.Context) {
|
||||
return func(c *gin.Context) {
|
||||
if !strings.Contains(c.Request.URL.Path, "/v1/app") {
|
||||
loginType := c.GetString(string(constant.LoginType))
|
||||
if loginType == "" {
|
||||
loginType = c.GetHeader("Login-Type")
|
||||
}
|
||||
|
||||
if loginType != "device" {
|
||||
c.Next()
|
||||
return
|
||||
}
|
||||
rw := NewResponseWriter(c, svc)
|
||||
|
||||
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), constant.LoginType, loginType))
|
||||
|
||||
if !srvCtx.Config.Device.Enable || srvCtx.Config.Device.SecuritySecret == "" {
|
||||
c.Next()
|
||||
return
|
||||
}
|
||||
rw := NewResponseWriter(c, srvCtx)
|
||||
if !rw.Decrypt() {
|
||||
result.HttpResult(c, nil, errors.Wrapf(xerr.NewErrCode(xerr.InvalidCiphertext), "Invalid ciphertext"))
|
||||
c.Abort()
|
||||
@@ -50,17 +62,10 @@ func NewResponseWriter(c *gin.Context, srvCtx *svc.ServiceContext) (rw *Response
|
||||
body: new(bytes.Buffer),
|
||||
ResponseWriter: c.Writer,
|
||||
}
|
||||
applicationConfig, err := srvCtx.ApplicationModel.FindOneConfig(c, 1)
|
||||
if err != nil {
|
||||
logger.Errorf("[AppMiddleware] find application config error: %v", err.Error())
|
||||
return
|
||||
}
|
||||
if strings.ToUpper(applicationConfig.EncryptionMethod) == "AES" && applicationConfig.EncryptionKey != "" {
|
||||
rw.encryptionKey = applicationConfig.EncryptionKey
|
||||
rw.encryptionMethod = applicationConfig.EncryptionMethod
|
||||
rw.encryption = true
|
||||
}
|
||||
return
|
||||
rw.encryptionKey = srvCtx.Config.Device.SecuritySecret
|
||||
rw.encryptionMethod = "AES"
|
||||
rw.encryption = true
|
||||
return rw
|
||||
}
|
||||
|
||||
func (rw *ResponseWriter) Encrypt() {
|
||||
@@ -6,13 +6,13 @@ import (
|
||||
"io"
|
||||
"time"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/logger"
|
||||
"github.com/perfect-panel/server/pkg/logger"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/xerr"
|
||||
"github.com/perfect-panel/server/pkg/xerr"
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/perfect-panel/ppanel-server/internal/svc"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
)
|
||||
|
||||
type responseBodyWriter struct {
|
||||
@@ -44,6 +44,9 @@ func LoggerMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
|
||||
// Start recording logs
|
||||
cost := time.Since(start)
|
||||
responseStatus := c.Writer.Status()
|
||||
|
||||
host := c.Request.Host
|
||||
|
||||
logs := []logger.LogField{
|
||||
{
|
||||
Key: "status",
|
||||
@@ -51,7 +54,7 @@ func LoggerMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
|
||||
},
|
||||
{
|
||||
Key: "request",
|
||||
Value: c.Request.Method + " " + c.Request.URL.String(),
|
||||
Value: c.Request.Method + " " + host + c.Request.URL.String(),
|
||||
},
|
||||
{
|
||||
Key: "query",
|
||||
@@ -88,6 +91,10 @@ func LoggerMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
|
||||
} else {
|
||||
logger.WithContext(c.Request.Context()).Infow("HTTP Request", logs...)
|
||||
}
|
||||
|
||||
if responseStatus == 404 {
|
||||
logger.WithContext(c.Request.Context()).Debugf("404 Not Found: Host:%s Path:%s IsPanDomain:%v", host, c.Request.URL.Path, svc.Config.Subscribe.PanDomain)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,10 +3,10 @@ package middleware
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/constant"
|
||||
"github.com/perfect-panel/server/pkg/constant"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/perfect-panel/ppanel-server/internal/svc"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
)
|
||||
|
||||
type PaymentParams struct {
|
||||
|
||||
@@ -1,17 +1,60 @@
|
||||
package middleware
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/perfect-panel/ppanel-server/internal/logic/subscribe"
|
||||
"github.com/perfect-panel/ppanel-server/internal/svc"
|
||||
"github.com/perfect-panel/ppanel-server/internal/types"
|
||||
"github.com/perfect-panel/server/internal/logic/subscribe"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
"github.com/perfect-panel/server/internal/types"
|
||||
"github.com/perfect-panel/server/pkg/logger"
|
||||
"github.com/perfect-panel/server/pkg/tool"
|
||||
)
|
||||
|
||||
func PanDomainMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
|
||||
return func(c *gin.Context) {
|
||||
if svc.Config.Subscribe.PanDomain {
|
||||
|
||||
if svc.Config.Subscribe.PanDomain && c.Request.URL.Path == "/" {
|
||||
// intercept browser
|
||||
ua := c.GetHeader("User-Agent")
|
||||
|
||||
if svc.Config.Subscribe.UserAgentLimit {
|
||||
if ua == "" {
|
||||
c.String(http.StatusForbidden, "Access denied")
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
browserKeywords := tool.RemoveDuplicateElements(strings.Split(svc.Config.Subscribe.UserAgentList, "\n")...)
|
||||
var allow = false
|
||||
|
||||
// query client list
|
||||
clients, err := svc.ClientModel.List(c.Request.Context())
|
||||
if err != nil {
|
||||
logger.Errorw("[PanDomainMiddleware] Query client list failed", logger.Field("error", err.Error()))
|
||||
}
|
||||
for _, item := range clients {
|
||||
u := strings.ToLower(item.UserAgent)
|
||||
u = strings.Trim(u, " ")
|
||||
browserKeywords = append(browserKeywords, u)
|
||||
}
|
||||
|
||||
for _, keyword := range browserKeywords {
|
||||
keyword = strings.ToLower(strings.Trim(keyword, " "))
|
||||
if keyword == "" {
|
||||
continue
|
||||
}
|
||||
if strings.Contains(strings.ToLower(ua), keyword) {
|
||||
allow = true
|
||||
}
|
||||
}
|
||||
if !allow {
|
||||
c.String(http.StatusForbidden, "Access denied")
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
domain := c.Request.Host
|
||||
domainArr := strings.Split(domain, ".")
|
||||
domainFirst := domainArr[0]
|
||||
@@ -21,7 +64,7 @@ func PanDomainMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
|
||||
UA: c.Request.Header.Get("User-Agent"),
|
||||
}
|
||||
l := subscribe.NewSubscribeLogic(c, svc)
|
||||
resp, err := l.Generate(&request)
|
||||
resp, err := l.Handler(&request)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ package middleware
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/perfect-panel/ppanel-server/internal/svc"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
)
|
||||
|
||||
func ServerMiddleware(svc *svc.ServiceContext) func(c *gin.Context) {
|
||||
|
||||
@@ -6,18 +6,16 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/pkg/constant"
|
||||
"github.com/perfect-panel/server/pkg/constant"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/codes"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
|
||||
oteltrace "go.opentelemetry.io/otel/trace"
|
||||
|
||||
"github.com/perfect-panel/ppanel-server/internal/svc"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/logger"
|
||||
"github.com/perfect-panel/ppanel-server/pkg/trace"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
"github.com/perfect-panel/server/pkg/trace"
|
||||
)
|
||||
|
||||
// statusByWriter returns a span status code and message for an HTTP status code
|
||||
@@ -71,19 +69,13 @@ func TraceMiddleware(_ *svc.ServiceContext) func(ctx *gin.Context) {
|
||||
)
|
||||
defer span.End()
|
||||
|
||||
requestId, err := uuid.NewV7()
|
||||
if err != nil {
|
||||
logger.Errorw(
|
||||
"failed to generate request id in uuid v7 format, fallback to uuid v4",
|
||||
logger.Field("error", err),
|
||||
)
|
||||
requestId = uuid.New()
|
||||
}
|
||||
c.Header(trace.RequestIdKey, requestId.String())
|
||||
requestId := trace.TraceIDFromContext(ctx)
|
||||
|
||||
c.Header(trace.RequestIdKey, requestId)
|
||||
|
||||
span.SetAttributes(requestAttributes(c.Request)...)
|
||||
span.SetAttributes(
|
||||
attribute.String("http.request_id", requestId.String()),
|
||||
attribute.String("http.request_id", requestId),
|
||||
semconv.HTTPRouteKey.String(c.FullPath()),
|
||||
)
|
||||
// context with request host
|
||||
|
||||
Reference in New Issue
Block a user