server.go 2.3 KB

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