cert.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package model
  2. import (
  3. "github.com/0xJacky/Nginx-UI/internal/helper"
  4. "github.com/0xJacky/Nginx-UI/internal/nginx"
  5. "github.com/go-acme/lego/v4/certcrypto"
  6. "github.com/go-acme/lego/v4/certificate"
  7. "github.com/lib/pq"
  8. "os"
  9. )
  10. const (
  11. AutoCertEnabled = 1
  12. AutoCertDisabled = -1
  13. CertChallengeMethodHTTP01 = "http01"
  14. CertChallengeMethodDNS01 = "dns01"
  15. )
  16. type CertDomains []string
  17. type CertificateResource struct {
  18. *certificate.Resource
  19. PrivateKey []byte `json:"private_key"`
  20. Certificate []byte `json:"certificate"`
  21. IssuerCertificate []byte `json:"issuerCertificate"`
  22. CSR []byte `json:"csr"`
  23. }
  24. type Cert struct {
  25. Model
  26. Name string `json:"name"`
  27. Domains pq.StringArray `json:"domains" gorm:"type:text[]"`
  28. Filename string `json:"filename"`
  29. SSLCertificatePath string `json:"ssl_certificate_path"`
  30. SSLCertificateKeyPath string `json:"ssl_certificate_key_path"`
  31. AutoCert int `json:"auto_cert"`
  32. ChallengeMethod string `json:"challenge_method"`
  33. DnsCredentialID int `json:"dns_credential_id"`
  34. DnsCredential *DnsCredential `json:"dns_credential,omitempty"`
  35. ACMEUserID int `json:"acme_user_id"`
  36. ACMEUser *AcmeUser `json:"acme_user,omitempty"`
  37. KeyType certcrypto.KeyType `json:"key_type"`
  38. Log string `json:"log"`
  39. Resource *CertificateResource `json:"-" gorm:"serializer:json"`
  40. }
  41. func FirstCert(confName string) (c Cert, err error) {
  42. err = db.First(&c, &Cert{
  43. Filename: confName,
  44. }).Error
  45. return
  46. }
  47. func FirstOrCreateCert(confName string, keyType certcrypto.KeyType) (c Cert, err error) {
  48. // Filename is used to check whether this site is enabled
  49. err = db.FirstOrCreate(&c, &Cert{Name: confName, Filename: confName, KeyType: keyType}).Error
  50. return
  51. }
  52. func (c *Cert) Insert() error {
  53. return db.Create(c).Error
  54. }
  55. func GetAutoCertList() (c []*Cert) {
  56. var t []*Cert
  57. if db == nil {
  58. return
  59. }
  60. db.Where("auto_cert", AutoCertEnabled).Find(&t)
  61. // check if this domain is enabled
  62. enabledConfig, err := os.ReadDir(nginx.GetConfPath("sites-enabled"))
  63. if err != nil {
  64. return
  65. }
  66. enabledConfigMap := make(map[string]bool)
  67. for i := range enabledConfig {
  68. enabledConfigMap[enabledConfig[i].Name()] = true
  69. }
  70. for _, v := range t {
  71. if v.ChallengeMethod == CertChallengeMethodDNS01 || enabledConfigMap[v.Filename] == true {
  72. c = append(c, v)
  73. }
  74. }
  75. return
  76. }
  77. func (c *Cert) Updates(n *Cert) error {
  78. return db.Model(&Cert{}).Where("id", c.ID).Updates(n).Error
  79. }
  80. func (c *Cert) ClearLog() {
  81. db.Model(&Cert{}).Where("id", c.ID).Update("log", "")
  82. }
  83. func (c *Cert) Remove() error {
  84. if c.Filename == "" {
  85. return db.Delete(c).Error
  86. }
  87. return db.Where("filename", c.Filename).Delete(c).Error
  88. }
  89. func (c *Cert) GetKeyType() certcrypto.KeyType {
  90. return helper.GetKeyType(c.KeyType)
  91. }
  92. func (c *CertificateResource) GetResource() certificate.Resource {
  93. return certificate.Resource{
  94. Domain: c.Resource.Domain,
  95. CertURL: c.Resource.CertURL,
  96. CertStableURL: c.Resource.CertStableURL,
  97. PrivateKey: c.PrivateKey,
  98. Certificate: c.Certificate,
  99. IssuerCertificate: c.IssuerCertificate,
  100. CSR: c.CSR,
  101. }
  102. }