cert.go 2.7 KB

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