cert.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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/lib/pq"
  7. "os"
  8. )
  9. const (
  10. AutoCertEnabled = 1
  11. AutoCertDisabled = -1
  12. CertChallengeMethodHTTP01 = "http01"
  13. CertChallengeMethodDNS01 = "dns01"
  14. )
  15. type CertDomains []string
  16. type Cert struct {
  17. Model
  18. Name string `json:"name"`
  19. Domains pq.StringArray `json:"domains" gorm:"type:text[]"`
  20. Filename string `json:"filename"`
  21. SSLCertificatePath string `json:"ssl_certificate_path"`
  22. SSLCertificateKeyPath string `json:"ssl_certificate_key_path"`
  23. AutoCert int `json:"auto_cert"`
  24. ChallengeMethod string `json:"challenge_method"`
  25. DnsCredentialID int `json:"dns_credential_id"`
  26. DnsCredential *DnsCredential `json:"dns_credential,omitempty"`
  27. ACMEUserID int `json:"acme_user_id"`
  28. ACMEUser *AcmeUser `json:"acme_user,omitempty"`
  29. KeyType certcrypto.KeyType `json:"key_type"`
  30. Log string `json:"log"`
  31. }
  32. func FirstCert(confName string) (c Cert, err error) {
  33. err = db.First(&c, &Cert{
  34. Filename: confName,
  35. }).Error
  36. return
  37. }
  38. func FirstOrCreateCert(confName string, keyType certcrypto.KeyType) (c Cert, err error) {
  39. // Filename is used to check whether this site is enabled
  40. err = db.FirstOrCreate(&c, &Cert{Name: confName, Filename: confName, KeyType: keyType}).Error
  41. return
  42. }
  43. func (c *Cert) Insert() error {
  44. return db.Create(c).Error
  45. }
  46. func GetAutoCertList() (c []*Cert) {
  47. var t []*Cert
  48. if db == nil {
  49. return
  50. }
  51. db.Where("auto_cert", AutoCertEnabled).Find(&t)
  52. // check if this domain is enabled
  53. enabledConfig, err := os.ReadDir(nginx.GetConfPath("sites-enabled"))
  54. if err != nil {
  55. return
  56. }
  57. enabledConfigMap := make(map[string]bool)
  58. for i := range enabledConfig {
  59. enabledConfigMap[enabledConfig[i].Name()] = true
  60. }
  61. for _, v := range t {
  62. if v.ChallengeMethod == CertChallengeMethodDNS01 || enabledConfigMap[v.Filename] == true {
  63. c = append(c, v)
  64. }
  65. }
  66. return
  67. }
  68. func (c *Cert) Updates(n *Cert) error {
  69. return db.Model(&Cert{}).Where("id", c.ID).Updates(n).Error
  70. }
  71. func (c *Cert) ClearLog() {
  72. db.Model(&Cert{}).Where("id", c.ID).Update("log", "")
  73. }
  74. func (c *Cert) Remove() error {
  75. if c.Filename == "" {
  76. return db.Delete(c).Error
  77. }
  78. return db.Where("filename", c.Filename).Delete(c).Error
  79. }
  80. func (c *Cert) GetKeyType() certcrypto.KeyType {
  81. return helper.GetKeyType(c.KeyType)
  82. }