mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 02:15:48 +02:00
1. User can now view the latest renew logs of the certain certificate. 2. Add manually renew button in certificate modify page for managed certificate (auto cert)
174 lines
4.4 KiB
Go
174 lines
4.4 KiB
Go
package certificate
|
|
|
|
import (
|
|
"github.com/0xJacky/Nginx-UI/api"
|
|
"github.com/0xJacky/Nginx-UI/api/cosy"
|
|
"github.com/0xJacky/Nginx-UI/internal/cert"
|
|
"github.com/0xJacky/Nginx-UI/model"
|
|
"github.com/0xJacky/Nginx-UI/query"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/spf13/cast"
|
|
"net/http"
|
|
"os"
|
|
)
|
|
|
|
type APICertificate struct {
|
|
*model.Cert
|
|
SSLCertificate string `json:"ssl_certificate,omitempty"`
|
|
SSLCertificateKey string `json:"ssl_certificate_key,omitempty"`
|
|
CertificateInfo *cert.Info `json:"certificate_info,omitempty"`
|
|
}
|
|
|
|
func Transformer(certModel *model.Cert) (certificate *APICertificate) {
|
|
var sslCertificationBytes, sslCertificationKeyBytes []byte
|
|
var certificateInfo *cert.Info
|
|
if certModel.SSLCertificatePath != "" {
|
|
if _, err := os.Stat(certModel.SSLCertificatePath); err == nil {
|
|
sslCertificationBytes, _ = os.ReadFile(certModel.SSLCertificatePath)
|
|
}
|
|
|
|
certificateInfo, _ = cert.GetCertInfo(certModel.SSLCertificatePath)
|
|
}
|
|
|
|
if certModel.SSLCertificateKeyPath != "" {
|
|
if _, err := os.Stat(certModel.SSLCertificateKeyPath); err == nil {
|
|
sslCertificationKeyBytes, _ = os.ReadFile(certModel.SSLCertificateKeyPath)
|
|
}
|
|
}
|
|
|
|
return &APICertificate{
|
|
Cert: certModel,
|
|
SSLCertificate: string(sslCertificationBytes),
|
|
SSLCertificateKey: string(sslCertificationKeyBytes),
|
|
CertificateInfo: certificateInfo,
|
|
}
|
|
}
|
|
|
|
func GetCertList(c *gin.Context) {
|
|
cosy.Core[model.Cert](c).SetFussy("name", "domain").SetTransformer(func(m *model.Cert) any {
|
|
|
|
info, _ := cert.GetCertInfo(m.SSLCertificatePath)
|
|
|
|
return APICertificate{
|
|
Cert: m,
|
|
CertificateInfo: info,
|
|
}
|
|
}).PagingList()
|
|
}
|
|
|
|
func GetCert(c *gin.Context) {
|
|
q := query.Cert
|
|
|
|
certModel, err := q.FirstByID(cast.ToInt(c.Param("id")))
|
|
|
|
if err != nil {
|
|
api.ErrHandler(c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, Transformer(certModel))
|
|
}
|
|
|
|
func AddCert(c *gin.Context) {
|
|
var json struct {
|
|
Name string `json:"name"`
|
|
SSLCertificatePath string `json:"ssl_certificate_path" binding:"required"`
|
|
SSLCertificateKeyPath string `json:"ssl_certificate_key_path" binding:"required"`
|
|
SSLCertificate string `json:"ssl_certificate"`
|
|
SSLCertificateKey string `json:"ssl_certificate_key"`
|
|
ChallengeMethod string `json:"challenge_method"`
|
|
DnsCredentialID int `json:"dns_credential_id"`
|
|
}
|
|
if !api.BindAndValid(c, &json) {
|
|
return
|
|
}
|
|
certModel := &model.Cert{
|
|
Name: json.Name,
|
|
SSLCertificatePath: json.SSLCertificatePath,
|
|
SSLCertificateKeyPath: json.SSLCertificateKeyPath,
|
|
ChallengeMethod: json.ChallengeMethod,
|
|
DnsCredentialID: json.DnsCredentialID,
|
|
}
|
|
|
|
err := certModel.Insert()
|
|
|
|
if err != nil {
|
|
api.ErrHandler(c, err)
|
|
return
|
|
}
|
|
|
|
content := &cert.Content{
|
|
SSLCertificatePath: json.SSLCertificatePath,
|
|
SSLCertificateKeyPath: json.SSLCertificateKeyPath,
|
|
SSLCertificate: json.SSLCertificate,
|
|
SSLCertificateKey: json.SSLCertificateKey,
|
|
}
|
|
|
|
err = content.WriteFile()
|
|
|
|
if err != nil {
|
|
api.ErrHandler(c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, Transformer(certModel))
|
|
}
|
|
|
|
func ModifyCert(c *gin.Context) {
|
|
id := cast.ToInt(c.Param("id"))
|
|
|
|
var json struct {
|
|
Name string `json:"name"`
|
|
SSLCertificatePath string `json:"ssl_certificate_path" binding:"required"`
|
|
SSLCertificateKeyPath string `json:"ssl_certificate_key_path" binding:"required"`
|
|
SSLCertificate string `json:"ssl_certificate"`
|
|
SSLCertificateKey string `json:"ssl_certificate_key"`
|
|
ChallengeMethod string `json:"challenge_method"`
|
|
DnsCredentialID int `json:"dns_credential_id"`
|
|
}
|
|
|
|
if !api.BindAndValid(c, &json) {
|
|
return
|
|
}
|
|
|
|
q := query.Cert
|
|
|
|
certModel, err := q.FirstByID(id)
|
|
if err != nil {
|
|
api.ErrHandler(c, err)
|
|
return
|
|
}
|
|
|
|
err = certModel.Updates(&model.Cert{
|
|
Name: json.Name,
|
|
SSLCertificatePath: json.SSLCertificatePath,
|
|
SSLCertificateKeyPath: json.SSLCertificateKeyPath,
|
|
ChallengeMethod: json.ChallengeMethod,
|
|
DnsCredentialID: json.DnsCredentialID,
|
|
})
|
|
|
|
if err != nil {
|
|
api.ErrHandler(c, err)
|
|
return
|
|
}
|
|
|
|
content := &cert.Content{
|
|
SSLCertificatePath: json.SSLCertificatePath,
|
|
SSLCertificateKeyPath: json.SSLCertificateKeyPath,
|
|
SSLCertificate: json.SSLCertificate,
|
|
SSLCertificateKey: json.SSLCertificateKey,
|
|
}
|
|
|
|
err = content.WriteFile()
|
|
|
|
if err != nil {
|
|
api.ErrHandler(c, err)
|
|
return
|
|
}
|
|
|
|
GetCert(c)
|
|
}
|
|
|
|
func RemoveCert(c *gin.Context) {
|
|
cosy.Core[model.Cert](c).Destroy()
|
|
}
|