waflog.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package admin
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  6. adminRep "github.com/go-nunu/nunu-layout-advanced/internal/repository/admin"
  7. adminApi "github.com/go-nunu/nunu-layout-advanced/api/v1/admin"
  8. "github.com/go-nunu/nunu-layout-advanced/internal/repository/api/waf"
  9. "github.com/go-nunu/nunu-layout-advanced/internal/service"
  10. "strings"
  11. )
  12. type WafLogService interface {
  13. GetWafLog(ctx context.Context, id int64) (*model.WafLog, error)
  14. GetWafLogList(ctx context.Context) ([]model.WafLog, error)
  15. AddWafLog(ctx context.Context, req adminApi.WafLog) error
  16. }
  17. func NewWafLogService(
  18. service *service.Service,
  19. wafLogRepository adminRep.WafLogRepository,
  20. globalLimitRepository waf.GlobalLimitRepository,
  21. ) WafLogService {
  22. return &wafLogService{
  23. Service: service,
  24. wafLogRepository: wafLogRepository,
  25. globalLimitRepository: globalLimitRepository,
  26. }
  27. }
  28. type wafLogService struct {
  29. *service.Service
  30. wafLogRepository adminRep.WafLogRepository
  31. globalLimitRepository waf.GlobalLimitRepository
  32. }
  33. var ApiDescriptionMap = map[string]string{
  34. "/webForward/get": "获取web详情",
  35. "/webForward/getList" : "获取web列表",
  36. "/webForward/add" : "添加web",
  37. "/webForward/update" : "更新web",
  38. "/webForward/delete" : "删除web",
  39. "/tcpForward/add" : "添加tcp",
  40. "/tcpForward/update" : "更新tcp",
  41. "/tcpForward/delete" : "删除tcp",
  42. "/tcpForward/getList" : "获取tcp列表",
  43. "/tcpForward/get" : "获取tcp详情",
  44. "/udpForward/add" : "添加udp",
  45. "/udpForward/update" : "更新udp",
  46. "/udpForward/delete" : "删除udp",
  47. "/udpForward/getList" : "获取udp列表",
  48. "/udpForward/get" : "获取udp详情",
  49. "/globalLimit/add" : "添加实例",
  50. "/globalLimit/edit" : "编辑实例",
  51. "/globalLimit/delete" : "删除实例",
  52. "/allowAndDeny/get" : "获取黑白名单详情",
  53. "/allowAndDeny/getList" : "获取黑白名单列表",
  54. "/allowAndDeny/add" : "添加黑白名单",
  55. "/allowAndDeny/edit" : "编辑黑白名单",
  56. "/allowAndDeny/delete" : "删除黑白名单",
  57. "/cc/getList" : "获取CC列表",
  58. "/cc/editState" : "删除CC黑名单",
  59. "/ccIpList/getList" : "获取CC白名单列表",
  60. "/ccIpList/add" : "添加CC白名单",
  61. "/ccIpList/edit" : "编辑CC白名单",
  62. "/ccIpList/delete" : "删除CC白名单",
  63. }
  64. func (s *wafLogService) getFirstPathSegment(path string) (segment []string, ok bool) {
  65. // 1. 为了统一处理,先去掉路径最前面的 "/"
  66. // 这样 "/v1/admin" 会变成 "v1/admin",而 "v1/admin" 保持不变
  67. trimmedPath := strings.TrimPrefix(path, "/")
  68. // 如果去掉 "/" 后字符串为空(比如原路径是 "/" 或 ""),则无法提取
  69. if trimmedPath == "" {
  70. return nil, false
  71. }
  72. // 2. 使用 "/" 作为分隔符来切割字符串
  73. // "v1/admin/menus" 会被切割成一个字符串切片 (slice): ["v1", "admin", "menus"]
  74. parts := strings.Split(trimmedPath, "/")
  75. // 3. 只要切片不为空,第一个元素就是我们需要的值
  76. // len(parts) > 0 这个检查可以保证程序不会因为空切片而出错
  77. if len(parts) > 0 {
  78. return parts, true
  79. }
  80. return nil, false
  81. }
  82. func (s *wafLogService) GetWafLog(ctx context.Context, id int64) (*model.WafLog, error) {
  83. return s.wafLogRepository.GetWafLog(ctx, id)
  84. }
  85. func (s *wafLogService) GetWafLogList(ctx context.Context) ([]model.WafLog, error) {
  86. return s.wafLogRepository.GetWafLogList(ctx)
  87. }
  88. func (s *wafLogService) AddWafLog(ctx context.Context, req adminApi.WafLog) error {
  89. if req.Api != "" {
  90. api := strings.TrimPrefix(req.Api, "/v1")
  91. if _, ok := ApiDescriptionMap[api]; ok {
  92. req.ApiName = ApiDescriptionMap[api]
  93. }
  94. apiType, ok := s.getFirstPathSegment(req.Api)
  95. if ok {
  96. req.ApiType = apiType[len(apiType)-1]
  97. }
  98. }
  99. userInfo, err := s.globalLimitRepository.GetUserInfo(ctx, int64(req.Uid))
  100. if err != nil {
  101. return err
  102. }
  103. req.Name = userInfo.Username
  104. extraData, err := json.Marshal(req.ExtraData)
  105. if err != nil {
  106. return err
  107. }
  108. return s.wafLogRepository.AddWafLog(ctx, &model.WafLog{
  109. Uid: req.Uid,
  110. Name: req.Name,
  111. RequestIp: req.RequestIp,
  112. RuleId: req.RuleId,
  113. HostId: req.HostId,
  114. UserAgent: req.UserAgent,
  115. Api: req.Api,
  116. ApiType: req.ApiType,
  117. ApiName: req.ApiName,
  118. ExtraData: extraData,
  119. })
  120. }