mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	用户系统也可以申请ACME证书
This commit is contained in:
		@@ -24,11 +24,11 @@ func (this *DNSProvider) Present(domain, token, keyAuth string) error {
 | 
				
			|||||||
	fqdn, value := dns01.GetRecord(domain, keyAuth)
 | 
						fqdn, value := dns01.GetRecord(domain, keyAuth)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 设置记录
 | 
						// 设置记录
 | 
				
			||||||
	index := strings.Index(fqdn, "."+this.dnsDomain)
 | 
						var index = strings.Index(fqdn, "."+this.dnsDomain)
 | 
				
			||||||
	if index < 0 {
 | 
						if index < 0 {
 | 
				
			||||||
		return errors.New("invalid fqdn value")
 | 
							return errors.New("invalid fqdn value")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	recordName := fqdn[:index]
 | 
						var recordName = fqdn[:index]
 | 
				
			||||||
	record, err := this.raw.QueryRecord(this.dnsDomain, recordName, dnstypes.RecordTypeTXT)
 | 
						record, err := this.raw.QueryRecord(this.dnsDomain, recordName, dnstypes.RecordTypeTXT)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errors.New("query DNS record failed: " + err.Error())
 | 
							return errors.New("query DNS record failed: " + err.Error())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -75,7 +75,7 @@ func (this *Request) runDNS() (certData []byte, keyData []byte, err error) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config := lego.NewConfig(this.task.User)
 | 
						var config = lego.NewConfig(this.task.User)
 | 
				
			||||||
	config.Certificate.KeyType = certcrypto.RSA2048
 | 
						config.Certificate.KeyType = certcrypto.RSA2048
 | 
				
			||||||
	config.CADirURL = this.task.Provider.APIURL
 | 
						config.CADirURL = this.task.Provider.APIURL
 | 
				
			||||||
	config.UserAgent = teaconst.ProductName + "/" + teaconst.Version
 | 
						config.UserAgent = teaconst.ProductName + "/" + teaconst.Version
 | 
				
			||||||
@@ -86,7 +86,7 @@ func (this *Request) runDNS() (certData []byte, keyData []byte, err error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 注册用户
 | 
						// 注册用户
 | 
				
			||||||
	resource := this.task.User.GetRegistration()
 | 
						var resource = this.task.User.GetRegistration()
 | 
				
			||||||
	if resource != nil {
 | 
						if resource != nil {
 | 
				
			||||||
		resource, err = client.Registration.QueryRegistration()
 | 
							resource, err = client.Registration.QueryRegistration()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -124,7 +124,7 @@ func (this *Request) runDNS() (certData []byte, keyData []byte, err error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 申请证书
 | 
						// 申请证书
 | 
				
			||||||
	request := certificate.ObtainRequest{
 | 
						var request = certificate.ObtainRequest{
 | 
				
			||||||
		Domains: this.task.Domains,
 | 
							Domains: this.task.Domains,
 | 
				
			||||||
		Bundle:  true,
 | 
							Bundle:  true,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -146,7 +146,7 @@ func (this *Request) runHTTP() (certData []byte, keyData []byte, err error) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config := lego.NewConfig(this.task.User)
 | 
						var config = lego.NewConfig(this.task.User)
 | 
				
			||||||
	config.Certificate.KeyType = certcrypto.RSA2048
 | 
						config.Certificate.KeyType = certcrypto.RSA2048
 | 
				
			||||||
	config.CADirURL = this.task.Provider.APIURL
 | 
						config.CADirURL = this.task.Provider.APIURL
 | 
				
			||||||
	config.UserAgent = teaconst.ProductName + "/" + teaconst.Version
 | 
						config.UserAgent = teaconst.ProductName + "/" + teaconst.Version
 | 
				
			||||||
@@ -157,7 +157,7 @@ func (this *Request) runHTTP() (certData []byte, keyData []byte, err error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 注册用户
 | 
						// 注册用户
 | 
				
			||||||
	resource := this.task.User.GetRegistration()
 | 
						var resource = this.task.User.GetRegistration()
 | 
				
			||||||
	if resource != nil {
 | 
						if resource != nil {
 | 
				
			||||||
		resource, err = client.Registration.QueryRegistration()
 | 
							resource, err = client.Registration.QueryRegistration()
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -195,7 +195,7 @@ func (this *Request) runHTTP() (certData []byte, keyData []byte, err error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 申请证书
 | 
						// 申请证书
 | 
				
			||||||
	request := certificate.ObtainRequest{
 | 
						var request = certificate.ObtainRequest{
 | 
				
			||||||
		Domains: this.task.Domains,
 | 
							Domains: this.task.Domains,
 | 
				
			||||||
		Bundle:  true,
 | 
							Bundle:  true,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package acme
 | 
					package acme
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
				
			||||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
						"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
				
			||||||
	_ "github.com/go-sql-driver/mysql"
 | 
						_ "github.com/go-sql-driver/mysql"
 | 
				
			||||||
	"github.com/iwind/TeaGo/Tea"
 | 
						"github.com/iwind/TeaGo/Tea"
 | 
				
			||||||
@@ -72,8 +73,9 @@ func (this *ACMEProviderAccountDAO) FindACMEProviderAccountName(tx *dbs.Tx, id i
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CreateAccount 创建账号
 | 
					// CreateAccount 创建账号
 | 
				
			||||||
func (this *ACMEProviderAccountDAO) CreateAccount(tx *dbs.Tx, name string, providerCode string, eabKid string, eabKey string) (int64, error) {
 | 
					func (this *ACMEProviderAccountDAO) CreateAccount(tx *dbs.Tx, userId int64, name string, providerCode string, eabKid string, eabKey string) (int64, error) {
 | 
				
			||||||
	var op = NewACMEProviderAccountOperator()
 | 
						var op = NewACMEProviderAccountOperator()
 | 
				
			||||||
 | 
						op.UserId = userId
 | 
				
			||||||
	op.Name = name
 | 
						op.Name = name
 | 
				
			||||||
	op.ProviderCode = providerCode
 | 
						op.ProviderCode = providerCode
 | 
				
			||||||
	op.EabKid = eabKid
 | 
						op.EabKid = eabKid
 | 
				
			||||||
@@ -98,15 +100,18 @@ func (this *ACMEProviderAccountDAO) UpdateAccount(tx *dbs.Tx, accountId int64, n
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CountAllEnabledAccounts 计算账号数量
 | 
					// CountAllEnabledAccounts 计算账号数量
 | 
				
			||||||
func (this *ACMEProviderAccountDAO) CountAllEnabledAccounts(tx *dbs.Tx) (int64, error) {
 | 
					func (this *ACMEProviderAccountDAO) CountAllEnabledAccounts(tx *dbs.Tx, userId int64) (int64, error) {
 | 
				
			||||||
	return this.Query(tx).
 | 
						return this.Query(tx).
 | 
				
			||||||
 | 
							State(ACMEProviderAccountStateEnabled).
 | 
				
			||||||
 | 
							Attr("userId", userId).
 | 
				
			||||||
		Count()
 | 
							Count()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ListEnabledAccounts 查找单页账号
 | 
					// ListEnabledAccounts 查找单页账号
 | 
				
			||||||
func (this *ACMEProviderAccountDAO) ListEnabledAccounts(tx *dbs.Tx, offset int64, size int64) (result []*ACMEProviderAccount, err error) {
 | 
					func (this *ACMEProviderAccountDAO) ListEnabledAccounts(tx *dbs.Tx, userId int64, offset int64, size int64) (result []*ACMEProviderAccount, err error) {
 | 
				
			||||||
	_, err = this.Query(tx).
 | 
						_, err = this.Query(tx).
 | 
				
			||||||
		State(ACMEProviderAccountStateEnabled).
 | 
							State(ACMEProviderAccountStateEnabled).
 | 
				
			||||||
 | 
							Attr("userId", userId).
 | 
				
			||||||
		Offset(offset).
 | 
							Offset(offset).
 | 
				
			||||||
		Limit(size).
 | 
							Limit(size).
 | 
				
			||||||
		DescPk().
 | 
							DescPk().
 | 
				
			||||||
@@ -116,12 +121,34 @@ func (this *ACMEProviderAccountDAO) ListEnabledAccounts(tx *dbs.Tx, offset int64
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FindAllEnabledAccountsWithProviderCode 根据服务商代号查找账号
 | 
					// FindAllEnabledAccountsWithProviderCode 根据服务商代号查找账号
 | 
				
			||||||
func (this *ACMEProviderAccountDAO) FindAllEnabledAccountsWithProviderCode(tx *dbs.Tx, providerCode string) (result []*ACMEProviderAccount, err error) {
 | 
					func (this *ACMEProviderAccountDAO) FindAllEnabledAccountsWithProviderCode(tx *dbs.Tx, userId int64, providerCode string) (result []*ACMEProviderAccount, err error) {
 | 
				
			||||||
	_, err = this.Query(tx).
 | 
						_, err = this.Query(tx).
 | 
				
			||||||
		State(ACMEProviderAccountStateEnabled).
 | 
							State(ACMEProviderAccountStateEnabled).
 | 
				
			||||||
		Attr("providerCode", providerCode).
 | 
							Attr("providerCode", providerCode).
 | 
				
			||||||
 | 
							Attr("userId", userId).
 | 
				
			||||||
		DescPk().
 | 
							DescPk().
 | 
				
			||||||
		Slice(&result).
 | 
							Slice(&result).
 | 
				
			||||||
		FindAll()
 | 
							FindAll()
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CheckUserAccount 检查是否为用户的服务商账号
 | 
				
			||||||
 | 
					func (this *ACMEProviderAccountDAO) CheckUserAccount(tx *dbs.Tx, userId int64, accountId int64) error {
 | 
				
			||||||
 | 
						if userId <= 0 || accountId <= 0 {
 | 
				
			||||||
 | 
							return models.ErrNotFound
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						b, err := this.Query(tx).
 | 
				
			||||||
 | 
							Pk(accountId).
 | 
				
			||||||
 | 
							State(ACMEProviderAccountStateEnabled).
 | 
				
			||||||
 | 
							Attr("userId", userId).
 | 
				
			||||||
 | 
							Exist()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !b {
 | 
				
			||||||
 | 
							return models.ErrNotFound
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,24 +3,26 @@ package acme
 | 
				
			|||||||
// ACMEProviderAccount ACME提供商
 | 
					// ACMEProviderAccount ACME提供商
 | 
				
			||||||
type ACMEProviderAccount struct {
 | 
					type ACMEProviderAccount struct {
 | 
				
			||||||
	Id           uint64 `field:"id"`           // ID
 | 
						Id           uint64 `field:"id"`           // ID
 | 
				
			||||||
 | 
						UserId       uint64 `field:"userId"`       // 用户ID
 | 
				
			||||||
	IsOn         bool   `field:"isOn"`         // 是否启用
 | 
						IsOn         bool   `field:"isOn"`         // 是否启用
 | 
				
			||||||
	Name         string `field:"name"`         // 名称
 | 
						Name         string `field:"name"`         // 名称
 | 
				
			||||||
	ProviderCode string `field:"providerCode"` // 代号
 | 
						ProviderCode string `field:"providerCode"` // 代号
 | 
				
			||||||
	Error        string `field:"error"`        // 最后一条错误信息
 | 
					 | 
				
			||||||
	EabKid       string `field:"eabKid"`       // KID
 | 
						EabKid       string `field:"eabKid"`       // KID
 | 
				
			||||||
	EabKey       string `field:"eabKey"`       // Key
 | 
						EabKey       string `field:"eabKey"`       // Key
 | 
				
			||||||
 | 
						Error        string `field:"error"`        // 最后一条错误信息
 | 
				
			||||||
	State        uint8  `field:"state"`        // 状态
 | 
						State        uint8  `field:"state"`        // 状态
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ACMEProviderAccountOperator struct {
 | 
					type ACMEProviderAccountOperator struct {
 | 
				
			||||||
	Id           interface{} // ID
 | 
						Id           any // ID
 | 
				
			||||||
	IsOn         interface{} // 是否启用
 | 
						UserId       any // 用户ID
 | 
				
			||||||
	Name         interface{} // 名称
 | 
						IsOn         any // 是否启用
 | 
				
			||||||
	ProviderCode interface{} // 代号
 | 
						Name         any // 名称
 | 
				
			||||||
	Error        interface{} // 最后一条错误信息
 | 
						ProviderCode any // 代号
 | 
				
			||||||
	EabKid       interface{} // KID
 | 
						EabKid       any // KID
 | 
				
			||||||
	EabKey       interface{} // Key
 | 
						EabKey       any // Key
 | 
				
			||||||
	State        interface{} // 状态
 | 
						Error        any // 最后一条错误信息
 | 
				
			||||||
 | 
						State        any // 状态
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewACMEProviderAccountOperator() *ACMEProviderAccountOperator {
 | 
					func NewACMEProviderAccountOperator() *ACMEProviderAccountOperator {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -107,7 +107,11 @@ func (this *ACMETaskDAO) DisableAllTasksWithCertId(tx *dbs.Tx, certId int64) err
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CountAllEnabledACMETasks 计算所有任务数量
 | 
					// CountAllEnabledACMETasks 计算所有任务数量
 | 
				
			||||||
func (this *ACMETaskDAO) CountAllEnabledACMETasks(tx *dbs.Tx, adminId int64, userId int64, isAvailable bool, isExpired bool, expiringDays int64, keyword string) (int64, error) {
 | 
					func (this *ACMETaskDAO) CountAllEnabledACMETasks(tx *dbs.Tx, adminId int64, userId int64, isAvailable bool, isExpired bool, expiringDays int64, keyword string) (int64, error) {
 | 
				
			||||||
	query := dbutils.NewQuery(tx, this, adminId, userId)
 | 
						var query = this.Query(tx)
 | 
				
			||||||
 | 
						if adminId > 0 {
 | 
				
			||||||
 | 
							query.Attr("adminId", adminId)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						query.Attr("userId", userId) // 这个条件必须加上
 | 
				
			||||||
	if isAvailable || isExpired || expiringDays > 0 {
 | 
						if isAvailable || isExpired || expiringDays > 0 {
 | 
				
			||||||
		query.Gt("certId", 0)
 | 
							query.Gt("certId", 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -138,7 +142,11 @@ func (this *ACMETaskDAO) CountAllEnabledACMETasks(tx *dbs.Tx, adminId int64, use
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ListEnabledACMETasks 列出单页任务
 | 
					// ListEnabledACMETasks 列出单页任务
 | 
				
			||||||
func (this *ACMETaskDAO) ListEnabledACMETasks(tx *dbs.Tx, adminId int64, userId int64, isAvailable bool, isExpired bool, expiringDays int64, keyword string, offset int64, size int64) (result []*ACMETask, err error) {
 | 
					func (this *ACMETaskDAO) ListEnabledACMETasks(tx *dbs.Tx, adminId int64, userId int64, isAvailable bool, isExpired bool, expiringDays int64, keyword string, offset int64, size int64) (result []*ACMETask, err error) {
 | 
				
			||||||
	query := dbutils.NewQuery(tx, this, adminId, userId)
 | 
						var query = this.Query(tx)
 | 
				
			||||||
 | 
						if adminId > 0 {
 | 
				
			||||||
 | 
							query.Attr("adminId", adminId)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						query.Attr("userId", userId) // 这个条件必须加上
 | 
				
			||||||
	if isAvailable || isExpired || expiringDays > 0 {
 | 
						if isAvailable || isExpired || expiringDays > 0 {
 | 
				
			||||||
		query.Gt("certId", 0)
 | 
							query.Gt("certId", 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -228,7 +236,13 @@ func (this *ACMETaskDAO) UpdateACMETask(tx *dbs.Tx, acmeTaskId int64, acmeUserId
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CheckACMETask 检查权限
 | 
					// CheckACMETask 检查权限
 | 
				
			||||||
func (this *ACMETaskDAO) CheckACMETask(tx *dbs.Tx, adminId int64, userId int64, acmeTaskId int64) (bool, error) {
 | 
					func (this *ACMETaskDAO) CheckACMETask(tx *dbs.Tx, adminId int64, userId int64, acmeTaskId int64) (bool, error) {
 | 
				
			||||||
	return dbutils.NewQuery(tx, this, adminId, userId).
 | 
						var query = this.Query(tx)
 | 
				
			||||||
 | 
						if adminId > 0 {
 | 
				
			||||||
 | 
							query.Attr("adminId", adminId)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						query.Attr("userId", userId) // 这个条件必须加上
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return query.
 | 
				
			||||||
		State(ACMETaskStateEnabled).
 | 
							State(ACMETaskStateEnabled).
 | 
				
			||||||
		Pk(acmeTaskId).
 | 
							Pk(acmeTaskId).
 | 
				
			||||||
		Exist()
 | 
							Exist()
 | 
				
			||||||
@@ -319,7 +333,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	remoteUser := acmeutils.NewUser(user.Email, privateKey, func(resource *registration.Resource) error {
 | 
						var remoteUser = acmeutils.NewUser(user.Email, privateKey, func(resource *registration.Resource) error {
 | 
				
			||||||
		resourceJSON, err := json.Marshal(resource)
 | 
							resourceJSON, err := json.Marshal(resource)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
@@ -382,7 +396,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
 | 
				
			|||||||
	acmeTask.Provider = acmeProvider
 | 
						acmeTask.Provider = acmeProvider
 | 
				
			||||||
	acmeTask.Account = acmeAccount
 | 
						acmeTask.Account = acmeAccount
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	acmeRequest := acmeutils.NewRequest(acmeTask)
 | 
						var acmeRequest = acmeutils.NewRequest(acmeTask)
 | 
				
			||||||
	acmeRequest.OnAuth(func(domain, token, keyAuth string) {
 | 
						acmeRequest.OnAuth(func(domain, token, keyAuth string) {
 | 
				
			||||||
		err := SharedACMEAuthenticationDAO.CreateAuth(tx, taskId, domain, token, keyAuth)
 | 
							err := SharedACMEAuthenticationDAO.CreateAuth(tx, taskId, domain, token, keyAuth)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
@@ -398,7 +412,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
 | 
				
			|||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					remotelogs.Error("ACME", "encode auth data failed: '"+task.AuthURL+"'")
 | 
										remotelogs.Error("ACME", "encode auth data failed: '"+task.AuthURL+"'")
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					client := utils.SharedHttpClient(5 * time.Second)
 | 
										var client = utils.SharedHttpClient(10 * time.Second)
 | 
				
			||||||
					req, err := http.NewRequest(http.MethodPost, task.AuthURL, bytes.NewReader(authJSON))
 | 
										req, err := http.NewRequest(http.MethodPost, task.AuthURL, bytes.NewReader(authJSON))
 | 
				
			||||||
					req.Header.Set("Content-Type", "application/json")
 | 
										req.Header.Set("Content-Type", "application/json")
 | 
				
			||||||
					req.Header.Set("User-Agent", teaconst.ProductName+"/"+teaconst.Version)
 | 
										req.Header.Set("User-Agent", teaconst.ProductName+"/"+teaconst.Version)
 | 
				
			||||||
@@ -423,7 +437,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 分析证书
 | 
						// 分析证书
 | 
				
			||||||
	sslConfig := &sslconfigs.SSLCertConfig{
 | 
						var sslConfig = &sslconfigs.SSLCertConfig{
 | 
				
			||||||
		CertData: certData,
 | 
							CertData: certData,
 | 
				
			||||||
		KeyData:  keyData,
 | 
							KeyData:  keyData,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -358,7 +358,7 @@ func (this *SSLCertDAO) FindAllExpiringCerts(tx *dbs.Tx, days int) (result []*SS
 | 
				
			|||||||
		days = 0
 | 
							days = 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deltaSeconds := int64(days * 86400)
 | 
						var deltaSeconds = int64(days * 86400)
 | 
				
			||||||
	_, err = this.Query(tx).
 | 
						_, err = this.Query(tx).
 | 
				
			||||||
		State(SSLCertStateEnabled).
 | 
							State(SSLCertStateEnabled).
 | 
				
			||||||
		Where("FROM_UNIXTIME(timeEndAt, '%Y-%m-%d')=:day AND FROM_UNIXTIME(notifiedAt, '%Y-%m-%d')!=:today").
 | 
							Where("FROM_UNIXTIME(timeEndAt, '%Y-%m-%d')=:day AND FROM_UNIXTIME(notifiedAt, '%Y-%m-%d')!=:today").
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ type ACMEProviderService struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// FindAllACMEProviders 查找所有的服务商
 | 
					// FindAllACMEProviders 查找所有的服务商
 | 
				
			||||||
func (this *ACMEProviderService) FindAllACMEProviders(ctx context.Context, req *pb.FindAllACMEProvidersRequest) (*pb.FindAllACMEProvidersResponse, error) {
 | 
					func (this *ACMEProviderService) FindAllACMEProviders(ctx context.Context, req *pb.FindAllACMEProvidersRequest) (*pb.FindAllACMEProvidersResponse, error) {
 | 
				
			||||||
	_, err := this.ValidateAdmin(ctx)
 | 
						_, _, err := this.ValidateAdminAndUser(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -37,7 +37,7 @@ func (this *ACMEProviderService) FindAllACMEProviders(ctx context.Context, req *
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// FindACMEProviderWithCode 根据代号查找服务商
 | 
					// FindACMEProviderWithCode 根据代号查找服务商
 | 
				
			||||||
func (this *ACMEProviderService) FindACMEProviderWithCode(ctx context.Context, req *pb.FindACMEProviderWithCodeRequest) (*pb.FindACMEProviderWithCodeResponse, error) {
 | 
					func (this *ACMEProviderService) FindACMEProviderWithCode(ctx context.Context, req *pb.FindACMEProviderWithCodeRequest) (*pb.FindACMEProviderWithCodeResponse, error) {
 | 
				
			||||||
	_, err := this.ValidateAdmin(ctx)
 | 
						_, _, err := this.ValidateAdminAndUser(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,13 +16,13 @@ type ACMEProviderAccountService struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CreateACMEProviderAccount 创建服务商账号
 | 
					// CreateACMEProviderAccount 创建服务商账号
 | 
				
			||||||
func (this *ACMEProviderAccountService) CreateACMEProviderAccount(ctx context.Context, req *pb.CreateACMEProviderAccountRequest) (*pb.CreateACMEProviderAccountResponse, error) {
 | 
					func (this *ACMEProviderAccountService) CreateACMEProviderAccount(ctx context.Context, req *pb.CreateACMEProviderAccountRequest) (*pb.CreateACMEProviderAccountResponse, error) {
 | 
				
			||||||
	_, err := this.ValidateAdmin(ctx)
 | 
						_, userId, err := this.ValidateAdminAndUser(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var tx = this.NullTx()
 | 
						var tx = this.NullTx()
 | 
				
			||||||
	accountId, err := acme.SharedACMEProviderAccountDAO.CreateAccount(tx, req.Name, req.ProviderCode, req.EabKid, req.EabKey)
 | 
						accountId, err := acme.SharedACMEProviderAccountDAO.CreateAccount(tx, userId, req.Name, req.ProviderCode, req.EabKid, req.EabKey)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -33,13 +33,13 @@ func (this *ACMEProviderAccountService) CreateACMEProviderAccount(ctx context.Co
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// FindAllACMEProviderAccountsWithProviderCode 使用代号查找服务商账号
 | 
					// FindAllACMEProviderAccountsWithProviderCode 使用代号查找服务商账号
 | 
				
			||||||
func (this *ACMEProviderAccountService) FindAllACMEProviderAccountsWithProviderCode(ctx context.Context, req *pb.FindAllACMEProviderAccountsWithProviderCodeRequest) (*pb.FindAllACMEProviderAccountsWithProviderCodeResponse, error) {
 | 
					func (this *ACMEProviderAccountService) FindAllACMEProviderAccountsWithProviderCode(ctx context.Context, req *pb.FindAllACMEProviderAccountsWithProviderCodeRequest) (*pb.FindAllACMEProviderAccountsWithProviderCodeResponse, error) {
 | 
				
			||||||
	_, err := this.ValidateAdmin(ctx)
 | 
						_, userId, err := this.ValidateAdminAndUser(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var tx = this.NullTx()
 | 
						var tx = this.NullTx()
 | 
				
			||||||
	accounts, err := acme.SharedACMEProviderAccountDAO.FindAllEnabledAccountsWithProviderCode(tx, req.AcmeProviderCode)
 | 
						accounts, err := acme.SharedACMEProviderAccountDAO.FindAllEnabledAccountsWithProviderCode(tx, userId, req.AcmeProviderCode)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -76,12 +76,21 @@ func (this *ACMEProviderAccountService) FindAllACMEProviderAccountsWithProviderC
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// UpdateACMEProviderAccount 修改服务商账号
 | 
					// UpdateACMEProviderAccount 修改服务商账号
 | 
				
			||||||
func (this *ACMEProviderAccountService) UpdateACMEProviderAccount(ctx context.Context, req *pb.UpdateACMEProviderAccountRequest) (*pb.RPCSuccess, error) {
 | 
					func (this *ACMEProviderAccountService) UpdateACMEProviderAccount(ctx context.Context, req *pb.UpdateACMEProviderAccountRequest) (*pb.RPCSuccess, error) {
 | 
				
			||||||
	_, err := this.ValidateAdmin(ctx)
 | 
						_, userId, err := this.ValidateAdminAndUser(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var tx = this.NullTx()
 | 
						var tx = this.NullTx()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查权限
 | 
				
			||||||
 | 
						if userId > 0 {
 | 
				
			||||||
 | 
							err = acme.SharedACMEProviderAccountDAO.CheckUserAccount(tx, userId, req.AcmeProviderAccountId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = acme.SharedACMEProviderAccountDAO.UpdateAccount(tx, req.AcmeProviderAccountId, req.Name, req.EabKid, req.EabKey)
 | 
						err = acme.SharedACMEProviderAccountDAO.UpdateAccount(tx, req.AcmeProviderAccountId, req.Name, req.EabKid, req.EabKey)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -91,12 +100,21 @@ func (this *ACMEProviderAccountService) UpdateACMEProviderAccount(ctx context.Co
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// DeleteACMEProviderAccount 删除服务商账号
 | 
					// DeleteACMEProviderAccount 删除服务商账号
 | 
				
			||||||
func (this *ACMEProviderAccountService) DeleteACMEProviderAccount(ctx context.Context, req *pb.DeleteACMEProviderAccountRequest) (*pb.RPCSuccess, error) {
 | 
					func (this *ACMEProviderAccountService) DeleteACMEProviderAccount(ctx context.Context, req *pb.DeleteACMEProviderAccountRequest) (*pb.RPCSuccess, error) {
 | 
				
			||||||
	_, err := this.ValidateAdmin(ctx)
 | 
						_, userId, err := this.ValidateAdminAndUser(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var tx = this.NullTx()
 | 
						var tx = this.NullTx()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查权限
 | 
				
			||||||
 | 
						if userId > 0 {
 | 
				
			||||||
 | 
							err = acme.SharedACMEProviderAccountDAO.CheckUserAccount(tx, userId, req.AcmeProviderAccountId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = acme.SharedACMEProviderAccountDAO.DisableACMEProviderAccount(tx, req.AcmeProviderAccountId)
 | 
						err = acme.SharedACMEProviderAccountDAO.DisableACMEProviderAccount(tx, req.AcmeProviderAccountId)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -106,12 +124,21 @@ func (this *ACMEProviderAccountService) DeleteACMEProviderAccount(ctx context.Co
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// FindEnabledACMEProviderAccount 查找单个服务商账号
 | 
					// FindEnabledACMEProviderAccount 查找单个服务商账号
 | 
				
			||||||
func (this *ACMEProviderAccountService) FindEnabledACMEProviderAccount(ctx context.Context, req *pb.FindEnabledACMEProviderAccountRequest) (*pb.FindEnabledACMEProviderAccountResponse, error) {
 | 
					func (this *ACMEProviderAccountService) FindEnabledACMEProviderAccount(ctx context.Context, req *pb.FindEnabledACMEProviderAccountRequest) (*pb.FindEnabledACMEProviderAccountResponse, error) {
 | 
				
			||||||
	_, err := this.ValidateAdmin(ctx)
 | 
						_, userId, err := this.ValidateAdminAndUser(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var tx = this.NullTx()
 | 
						var tx = this.NullTx()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 检查权限
 | 
				
			||||||
 | 
						if userId > 0 {
 | 
				
			||||||
 | 
							err = acme.SharedACMEProviderAccountDAO.CheckUserAccount(tx, userId, req.AcmeProviderAccountId)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	account, err := acme.SharedACMEProviderAccountDAO.FindEnabledACMEProviderAccount(tx, req.AcmeProviderAccountId)
 | 
						account, err := acme.SharedACMEProviderAccountDAO.FindEnabledACMEProviderAccount(tx, req.AcmeProviderAccountId)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
@@ -147,13 +174,13 @@ func (this *ACMEProviderAccountService) FindEnabledACMEProviderAccount(ctx conte
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// CountAllEnabledACMEProviderAccounts 计算所有服务商账号数量
 | 
					// CountAllEnabledACMEProviderAccounts 计算所有服务商账号数量
 | 
				
			||||||
func (this *ACMEProviderAccountService) CountAllEnabledACMEProviderAccounts(ctx context.Context, req *pb.CountAllEnabledACMEProviderAccountsRequest) (*pb.RPCCountResponse, error) {
 | 
					func (this *ACMEProviderAccountService) CountAllEnabledACMEProviderAccounts(ctx context.Context, req *pb.CountAllEnabledACMEProviderAccountsRequest) (*pb.RPCCountResponse, error) {
 | 
				
			||||||
	_, err := this.ValidateAdmin(ctx)
 | 
						_, userId, err := this.ValidateAdminAndUser(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var tx = this.NullTx()
 | 
						var tx = this.NullTx()
 | 
				
			||||||
	count, err := acme.SharedACMEProviderAccountDAO.CountAllEnabledAccounts(tx)
 | 
						count, err := acme.SharedACMEProviderAccountDAO.CountAllEnabledAccounts(tx, userId)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -162,13 +189,13 @@ func (this *ACMEProviderAccountService) CountAllEnabledACMEProviderAccounts(ctx
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ListEnabledACMEProviderAccounts 列出单页服务商账号
 | 
					// ListEnabledACMEProviderAccounts 列出单页服务商账号
 | 
				
			||||||
func (this *ACMEProviderAccountService) ListEnabledACMEProviderAccounts(ctx context.Context, req *pb.ListEnabledACMEProviderAccountsRequest) (*pb.ListEnabledACMEProviderAccountsResponse, error) {
 | 
					func (this *ACMEProviderAccountService) ListEnabledACMEProviderAccounts(ctx context.Context, req *pb.ListEnabledACMEProviderAccountsRequest) (*pb.ListEnabledACMEProviderAccountsResponse, error) {
 | 
				
			||||||
	_, err := this.ValidateAdmin(ctx)
 | 
						_, userId, err := this.ValidateAdminAndUser(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var tx = this.NullTx()
 | 
						var tx = this.NullTx()
 | 
				
			||||||
	accounts, err := acme.SharedACMEProviderAccountDAO.ListEnabledAccounts(tx, req.Offset, req.Size)
 | 
						accounts, err := acme.SharedACMEProviderAccountDAO.ListEnabledAccounts(tx, userId, req.Offset, req.Size)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -90,7 +90,7 @@ func (this *ACMETaskService) ListEnabledACMETasks(ctx context.Context, req *pb.L
 | 
				
			|||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	result := []*pb.ACMETask{}
 | 
						var result = []*pb.ACMETask{}
 | 
				
			||||||
	for _, task := range tasks {
 | 
						for _, task := range tasks {
 | 
				
			||||||
		// ACME用户
 | 
							// ACME用户
 | 
				
			||||||
		acmeUser, err := acmemodels.SharedACMEUserDAO.FindEnabledACMEUser(tx, int64(task.AcmeUserId))
 | 
							acmeUser, err := acmemodels.SharedACMEUserDAO.FindEnabledACMEUser(tx, int64(task.AcmeUserId))
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -102,8 +102,8 @@ func (this *SSLCertExpireCheckExecutor) Loop() error {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		for _, cert := range certs {
 | 
							for _, cert := range certs {
 | 
				
			||||||
			// 发送消息
 | 
								// 发送消息
 | 
				
			||||||
			subject := "SSL证书\"" + cert.Name + "\"在" + strconv.Itoa(days) + "天后将到期,"
 | 
								var subject = "SSL证书\"" + cert.Name + "\"在" + strconv.Itoa(days) + "天后将到期,"
 | 
				
			||||||
			msg := "SSL证书\"" + cert.Name + "\"(" + string(cert.DnsNames) + ")在" + strconv.Itoa(days) + "天后将到期,"
 | 
								var msg = "SSL证书\"" + cert.Name + "\"(" + string(cert.DnsNames) + ")在" + strconv.Itoa(days) + "天后将到期,"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// 是否有自动更新任务
 | 
								// 是否有自动更新任务
 | 
				
			||||||
			if cert.AcmeTaskId > 0 {
 | 
								if cert.AcmeTaskId > 0 {
 | 
				
			||||||
@@ -116,7 +116,7 @@ func (this *SSLCertExpireCheckExecutor) Loop() error {
 | 
				
			|||||||
						isOk, errMsg, _ := acme.SharedACMETaskDAO.RunTask(nil, int64(cert.AcmeTaskId))
 | 
											isOk, errMsg, _ := acme.SharedACMETaskDAO.RunTask(nil, int64(cert.AcmeTaskId))
 | 
				
			||||||
						if isOk {
 | 
											if isOk {
 | 
				
			||||||
							// 发送成功通知
 | 
												// 发送成功通知
 | 
				
			||||||
							subject := "系统已成功为你自动更新了证书\"" + cert.Name + "\""
 | 
												subject = "系统已成功为你自动更新了证书\"" + cert.Name + "\""
 | 
				
			||||||
							msg = "系统已成功为你自动更新了证书\"" + cert.Name + "\"(" + string(cert.DnsNames) + ")。"
 | 
												msg = "系统已成功为你自动更新了证书\"" + cert.Name + "\"(" + string(cert.DnsNames) + ")。"
 | 
				
			||||||
							err = models.SharedMessageDAO.CreateMessage(nil, int64(cert.AdminId), int64(cert.UserId), models.MessageTypeSSLCertACMETaskSuccess, models.MessageLevelSuccess, subject, msg, maps.Map{
 | 
												err = models.SharedMessageDAO.CreateMessage(nil, int64(cert.AdminId), int64(cert.UserId), models.MessageTypeSSLCertACMETaskSuccess, models.MessageLevelSuccess, subject, msg, maps.Map{
 | 
				
			||||||
								"certId":     cert.Id,
 | 
													"certId":     cert.Id,
 | 
				
			||||||
@@ -130,7 +130,7 @@ func (this *SSLCertExpireCheckExecutor) Loop() error {
 | 
				
			|||||||
							}
 | 
												}
 | 
				
			||||||
						} else {
 | 
											} else {
 | 
				
			||||||
							// 发送失败通知
 | 
												// 发送失败通知
 | 
				
			||||||
							subject := "系统在尝试自动更新证书\"" + cert.Name + "\"时发生错误"
 | 
												subject = "系统在尝试自动更新证书\"" + cert.Name + "\"时发生错误"
 | 
				
			||||||
							msg = "系统在尝试自动更新证书\"" + cert.Name + "\"(" + string(cert.DnsNames) + ")时发生错误:" + errMsg + "。请检查系统设置并修复错误。"
 | 
												msg = "系统在尝试自动更新证书\"" + cert.Name + "\"(" + string(cert.DnsNames) + ")时发生错误:" + errMsg + "。请检查系统设置并修复错误。"
 | 
				
			||||||
							err = models.SharedMessageDAO.CreateMessage(nil, int64(cert.AdminId), int64(cert.UserId), models.MessageTypeSSLCertACMETaskFailed, models.MessageLevelError, subject, msg, maps.Map{
 | 
												err = models.SharedMessageDAO.CreateMessage(nil, int64(cert.AdminId), int64(cert.UserId), models.MessageTypeSSLCertACMETaskFailed, models.MessageLevelError, subject, msg, maps.Map{
 | 
				
			||||||
								"certId":     cert.Id,
 | 
													"certId":     cert.Id,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user