issue.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package certificate
  2. import (
  3. "github.com/0xJacky/Nginx-UI/internal/cert"
  4. "github.com/uozi-tech/cosy/logger"
  5. "github.com/0xJacky/Nginx-UI/model"
  6. "github.com/gin-gonic/gin"
  7. "github.com/go-acme/lego/v4/certcrypto"
  8. "github.com/gorilla/websocket"
  9. "net/http"
  10. )
  11. const (
  12. Success = "success"
  13. Info = "info"
  14. Error = "error"
  15. )
  16. type IssueCertResponse struct {
  17. Status string `json:"status"`
  18. Message string `json:"message"`
  19. SSLCertificate string `json:"ssl_certificate,omitempty"`
  20. SSLCertificateKey string `json:"ssl_certificate_key,omitempty"`
  21. KeyType certcrypto.KeyType `json:"key_type"`
  22. }
  23. func handleIssueCertLogChan(conn *websocket.Conn, log *cert.Logger, logChan chan string) {
  24. defer func() {
  25. if err := recover(); err != nil {
  26. logger.Error(err)
  27. }
  28. }()
  29. for logString := range logChan {
  30. log.Info(logString)
  31. err := conn.WriteJSON(IssueCertResponse{
  32. Status: Info,
  33. Message: logString,
  34. })
  35. if err != nil {
  36. logger.Error(err)
  37. return
  38. }
  39. }
  40. }
  41. func IssueCert(c *gin.Context) {
  42. var upGrader = websocket.Upgrader{
  43. CheckOrigin: func(r *http.Request) bool {
  44. return true
  45. },
  46. }
  47. // upgrade http to websocket
  48. ws, err := upGrader.Upgrade(c.Writer, c.Request, nil)
  49. if err != nil {
  50. logger.Error(err)
  51. return
  52. }
  53. defer func(ws *websocket.Conn) {
  54. _ = ws.Close()
  55. }(ws)
  56. // read
  57. payload := &cert.ConfigPayload{}
  58. err = ws.ReadJSON(payload)
  59. if err != nil {
  60. logger.Error(err)
  61. return
  62. }
  63. certModel, err := model.FirstOrCreateCert(c.Param("name"), payload.GetKeyType())
  64. if err != nil {
  65. logger.Error(err)
  66. return
  67. }
  68. certInfo, _ := cert.GetCertInfo(certModel.SSLCertificatePath)
  69. if certInfo != nil {
  70. payload.Resource = certModel.Resource
  71. payload.NotBefore = certInfo.NotBefore
  72. }
  73. logChan := make(chan string, 1)
  74. errChan := make(chan error, 1)
  75. log := &cert.Logger{}
  76. log.SetCertModel(&certModel)
  77. payload.CertID = certModel.ID
  78. go cert.IssueCert(payload, logChan, errChan)
  79. go handleIssueCertLogChan(ws, log, logChan)
  80. // block, until errChan closes
  81. for err = range errChan {
  82. log.Error(err)
  83. // Save logs to db
  84. log.Exit()
  85. err = ws.WriteJSON(IssueCertResponse{
  86. Status: Error,
  87. Message: err.Error(),
  88. })
  89. if err != nil {
  90. logger.Error(err)
  91. return
  92. }
  93. return
  94. }
  95. err = certModel.Updates(&model.Cert{
  96. Domains: payload.ServerName,
  97. SSLCertificatePath: payload.GetCertificatePath(),
  98. SSLCertificateKeyPath: payload.GetCertificateKeyPath(),
  99. AutoCert: model.AutoCertEnabled,
  100. KeyType: payload.KeyType,
  101. ChallengeMethod: payload.ChallengeMethod,
  102. DnsCredentialID: payload.DNSCredentialID,
  103. Resource: payload.Resource,
  104. MustStaple: payload.MustStaple,
  105. LegoDisableCNAMESupport: payload.LegoDisableCNAMESupport,
  106. })
  107. if err != nil {
  108. logger.Error(err)
  109. _ = ws.WriteJSON(IssueCertResponse{
  110. Status: Error,
  111. Message: err.Error(),
  112. })
  113. return
  114. }
  115. // Save logs to db
  116. log.Exit()
  117. err = ws.WriteJSON(IssueCertResponse{
  118. Status: Success,
  119. Message: "Issued certificate successfully",
  120. SSLCertificate: payload.GetCertificatePath(),
  121. SSLCertificateKey: payload.GetCertificateKeyPath(),
  122. KeyType: payload.GetKeyType(),
  123. })
  124. if err != nil {
  125. logger.Error(err)
  126. return
  127. }
  128. }