server.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 Register(c *gin.Context) {
  14. locker.Lock()
  15. defer locker.Unlock()
  16. var request dto.RegisterRequest
  17. if err := c.ShouldBindJSON(&request); err != nil {
  18. dto.BadRequest(c, err)
  19. return
  20. }
  21. for _, node := range nodes {
  22. if node.Ip == request.Ip {
  23. node.Ip = request.Ip
  24. node.Secret = request.Secret
  25. node.CountryCode = request.CountryCode
  26. node.LastUpdateTime = time.Now()
  27. c.JSON(http.StatusOK, dto.RegisterResponse{
  28. Response: dto.NewOkResponse(),
  29. Data: dto.RegisterResult{
  30. Success: true,
  31. },
  32. })
  33. return
  34. }
  35. }
  36. node := &model.Node{
  37. Ip: request.Ip,
  38. Secret: request.Secret,
  39. LastUpdateTime: time.Now(),
  40. }
  41. nodes = append(nodes, node)
  42. log.Printf("update nodes: %+v", nodes)
  43. }
  44. func List(c *gin.Context) {
  45. locker.RLock()
  46. defer locker.RUnlock()
  47. dtoNodes := make([]dto.Node, 0)
  48. for _, node := range nodes {
  49. if node.LastUpdateTime.Add(10 * time.Second).After(time.Now()) {
  50. dtoNodes = append(dtoNodes, dto.Node{
  51. Ip: node.Ip,
  52. CountryCode: node.CountryCode,
  53. })
  54. }
  55. }
  56. c.JSON(http.StatusOK, dto.ListResponse{
  57. Response: dto.NewOkResponse(),
  58. Data: dtoNodes,
  59. })
  60. }
  61. func Secret(c *gin.Context) {
  62. locker.RLock()
  63. defer locker.RUnlock()
  64. var request dto.DetailRequest
  65. if err := c.ShouldBindQuery(&request); err != nil {
  66. dto.BadRequest(c, err)
  67. return
  68. }
  69. for _, node := range nodes {
  70. if node.Ip == request.Ip {
  71. //secret, err := util.AesEncrypt([]byte(node.Secret))
  72. //if err != nil {
  73. // dto.Error(c, err)
  74. // return
  75. //}
  76. c.Header("Content-Disposition", "attachment; filename=client.ovpn")
  77. c.Data(http.StatusOK, "plain/text", []byte(node.Secret))
  78. return
  79. }
  80. }
  81. c.JSON(http.StatusNotFound, gin.H{
  82. "message": "not found ip",
  83. })
  84. }
  85. func Health(c *gin.Context) {
  86. c.JSON(http.StatusOK, gin.H{"status": "up"})
  87. }