server.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package server
  2. import (
  3. "be-vpn/internal/dto"
  4. "be-vpn/internal/model"
  5. "github.com/gin-gonic/gin"
  6. "log"
  7. "math/rand"
  8. "net/http"
  9. "sync"
  10. "time"
  11. )
  12. var nodes = make([]*model.Node, 0)
  13. var locker = sync.RWMutex{}
  14. func Config(c *gin.Context) {
  15. c.JSON(http.StatusOK, dto.ConfigResponse{
  16. Response: dto.NewOkResponse(),
  17. Data: dto.ConfigResult{
  18. FreeTrialDuration: (time.Hour * 1).Milliseconds() / 1000,
  19. },
  20. })
  21. }
  22. func Register(c *gin.Context) {
  23. locker.Lock()
  24. defer locker.Unlock()
  25. var request dto.RegisterRequest
  26. if err := c.ShouldBindJSON(&request); err != nil {
  27. dto.BadRequest(c, err)
  28. return
  29. }
  30. for _, node := range nodes {
  31. if node.Ip == request.Ip {
  32. node.Ip = request.Ip
  33. node.Secret = request.Secret
  34. node.CountryCode = request.CountryCode
  35. node.CountryName = request.CountryName
  36. node.LastUpdateTime = time.Now()
  37. c.JSON(http.StatusOK, dto.RegisterResponse{
  38. Response: dto.NewOkResponse(),
  39. Data: dto.RegisterResult{
  40. Success: true,
  41. },
  42. })
  43. return
  44. }
  45. }
  46. node := &model.Node{
  47. Ip: request.Ip,
  48. Secret: request.Secret,
  49. LastUpdateTime: time.Now(),
  50. }
  51. nodes = append(nodes, node)
  52. log.Printf("update nodes: %+v", nodes)
  53. }
  54. func List(c *gin.Context) {
  55. locker.RLock()
  56. defer locker.RUnlock()
  57. dtoNodes := make([]dto.Node, 0)
  58. for _, node := range nodes {
  59. if node.LastUpdateTime.Add(10 * time.Second).After(time.Now()) {
  60. dtoNodes = append(dtoNodes, dto.Node{
  61. Ip: node.Ip,
  62. CountryCode: node.CountryCode,
  63. CountryName: node.CountryName,
  64. Icon: "https://img.zcool.cn/community/010a5a57dbc2140000018c1b0a9b5f.png",
  65. })
  66. }
  67. }
  68. c.JSON(http.StatusOK, dto.ListResponse{
  69. Response: dto.NewOkResponse(),
  70. Data: dtoNodes,
  71. })
  72. }
  73. func SecretRandom(c *gin.Context) {
  74. locker.RLock()
  75. defer locker.RUnlock()
  76. random := rand.Intn(len(nodes))
  77. for i, node := range nodes {
  78. if i == random {
  79. c.Header("Content-Disposition", "attachment; filename=client.ovpn")
  80. c.Data(http.StatusOK, "plain/text", []byte(node.Secret))
  81. return
  82. }
  83. }
  84. c.JSON(http.StatusNotFound, gin.H{
  85. "message": "not found",
  86. })
  87. }
  88. func Secret(c *gin.Context) {
  89. locker.RLock()
  90. defer locker.RUnlock()
  91. var request dto.DetailRequest
  92. if err := c.ShouldBindQuery(&request); err != nil {
  93. dto.BadRequest(c, err)
  94. return
  95. }
  96. for _, node := range nodes {
  97. if node.Ip == request.Ip {
  98. //secret, err := util.AesEncrypt([]byte(node.Secret))
  99. //if err != nil {
  100. // dto.Error(c, err)
  101. // return
  102. //}
  103. c.Header("Content-Disposition", "attachment; filename=client.ovpn")
  104. c.Data(http.StatusOK, "plain/text", []byte(node.Secret))
  105. return
  106. }
  107. }
  108. c.JSON(http.StatusNotFound, gin.H{
  109. "message": "not found ip",
  110. })
  111. }
  112. func Health(c *gin.Context) {
  113. c.JSON(http.StatusOK, gin.H{"status": "up"})
  114. }