payload.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package cert
  2. import (
  3. "github.com/0xJacky/Nginx-UI/internal/helper"
  4. "github.com/0xJacky/Nginx-UI/internal/logger"
  5. "github.com/0xJacky/Nginx-UI/internal/nginx"
  6. "github.com/0xJacky/Nginx-UI/model"
  7. "github.com/0xJacky/Nginx-UI/query"
  8. "github.com/go-acme/lego/v4/certcrypto"
  9. "github.com/pkg/errors"
  10. "log"
  11. "os"
  12. "path/filepath"
  13. "strings"
  14. "time"
  15. )
  16. type ConfigPayload struct {
  17. CertID int `json:"cert_id"`
  18. ServerName []string `json:"server_name"`
  19. ChallengeMethod string `json:"challenge_method"`
  20. DNSCredentialID int `json:"dns_credential_id"`
  21. ACMEUserID int `json:"acme_user_id"`
  22. KeyType certcrypto.KeyType `json:"key_type"`
  23. Resource *model.CertificateResource `json:"resource,omitempty"`
  24. NotBefore time.Time
  25. }
  26. func (c *ConfigPayload) GetACMEUser() (user *model.AcmeUser, err error) {
  27. u := query.AcmeUser
  28. // if acme_user_id == 0, use default user
  29. if c.ACMEUserID == 0 {
  30. return GetDefaultACMEUser()
  31. }
  32. // use the acme_user_id to get the acme user
  33. user, err = u.Where(u.ID.Eq(c.ACMEUserID)).First()
  34. // if acme_user not exist, use default user
  35. if err != nil {
  36. logger.Error(err)
  37. return GetDefaultACMEUser()
  38. }
  39. return
  40. }
  41. func (c *ConfigPayload) GetKeyType() certcrypto.KeyType {
  42. return helper.GetKeyType(c.KeyType)
  43. }
  44. func (c *ConfigPayload) WriteFile(l *log.Logger, errChan chan error) {
  45. name := strings.Join(c.ServerName, "_")
  46. saveDir := nginx.GetConfPath("ssl/" + name + "_" + string(c.KeyType))
  47. if _, err := os.Stat(saveDir); os.IsNotExist(err) {
  48. err = os.MkdirAll(saveDir, 0755)
  49. if err != nil {
  50. errChan <- errors.Wrap(err, "mkdir error")
  51. return
  52. }
  53. }
  54. // Each certificate comes back with the cert bytes, the bytes of the client's
  55. // private key, and a certificate URL. SAVE THESE TO DISK.
  56. l.Println("[INFO] [Nginx UI] Writing certificate to disk")
  57. err := os.WriteFile(filepath.Join(saveDir, "fullchain.cer"),
  58. c.Resource.Certificate, 0644)
  59. if err != nil {
  60. errChan <- errors.Wrap(err, "write fullchain.cer error")
  61. return
  62. }
  63. l.Println("[INFO] [Nginx UI] Writing certificate private key to disk")
  64. err = os.WriteFile(filepath.Join(saveDir, "private.key"),
  65. c.Resource.PrivateKey, 0644)
  66. if err != nil {
  67. errChan <- errors.Wrap(err, "write private.key error")
  68. return
  69. }
  70. // update database
  71. if c.CertID <= 0 {
  72. return
  73. }
  74. db := model.UseDB()
  75. db.Where("id = ?", c.CertID).Updates(&model.Cert{
  76. SSLCertificatePath: filepath.Join(saveDir, "fullchain.cer"),
  77. SSLCertificateKeyPath: filepath.Join(saveDir, "private.key"),
  78. })
  79. }