mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 07:50:25 +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)
 | 
			
		||||
 | 
			
		||||
	// 设置记录
 | 
			
		||||
	index := strings.Index(fqdn, "."+this.dnsDomain)
 | 
			
		||||
	var index = strings.Index(fqdn, "."+this.dnsDomain)
 | 
			
		||||
	if index < 0 {
 | 
			
		||||
		return errors.New("invalid fqdn value")
 | 
			
		||||
	}
 | 
			
		||||
	recordName := fqdn[:index]
 | 
			
		||||
	var recordName = fqdn[:index]
 | 
			
		||||
	record, err := this.raw.QueryRecord(this.dnsDomain, recordName, dnstypes.RecordTypeTXT)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return errors.New("query DNS record failed: " + err.Error())
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ func (this *Request) runDNS() (certData []byte, keyData []byte, err error) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	config := lego.NewConfig(this.task.User)
 | 
			
		||||
	var config = lego.NewConfig(this.task.User)
 | 
			
		||||
	config.Certificate.KeyType = certcrypto.RSA2048
 | 
			
		||||
	config.CADirURL = this.task.Provider.APIURL
 | 
			
		||||
	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 {
 | 
			
		||||
		resource, err = client.Registration.QueryRegistration()
 | 
			
		||||
		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,
 | 
			
		||||
		Bundle:  true,
 | 
			
		||||
	}
 | 
			
		||||
@@ -146,7 +146,7 @@ func (this *Request) runHTTP() (certData []byte, keyData []byte, err error) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	config := lego.NewConfig(this.task.User)
 | 
			
		||||
	var config = lego.NewConfig(this.task.User)
 | 
			
		||||
	config.Certificate.KeyType = certcrypto.RSA2048
 | 
			
		||||
	config.CADirURL = this.task.Provider.APIURL
 | 
			
		||||
	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 {
 | 
			
		||||
		resource, err = client.Registration.QueryRegistration()
 | 
			
		||||
		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,
 | 
			
		||||
		Bundle:  true,
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package acme
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/db/models"
 | 
			
		||||
	"github.com/TeaOSLab/EdgeAPI/internal/errors"
 | 
			
		||||
	_ "github.com/go-sql-driver/mysql"
 | 
			
		||||
	"github.com/iwind/TeaGo/Tea"
 | 
			
		||||
@@ -72,8 +73,9 @@ func (this *ACMEProviderAccountDAO) FindACMEProviderAccountName(tx *dbs.Tx, id i
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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()
 | 
			
		||||
	op.UserId = userId
 | 
			
		||||
	op.Name = name
 | 
			
		||||
	op.ProviderCode = providerCode
 | 
			
		||||
	op.EabKid = eabKid
 | 
			
		||||
@@ -98,15 +100,18 @@ func (this *ACMEProviderAccountDAO) UpdateAccount(tx *dbs.Tx, accountId int64, n
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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).
 | 
			
		||||
		State(ACMEProviderAccountStateEnabled).
 | 
			
		||||
		Attr("userId", userId).
 | 
			
		||||
		Count()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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).
 | 
			
		||||
		State(ACMEProviderAccountStateEnabled).
 | 
			
		||||
		Attr("userId", userId).
 | 
			
		||||
		Offset(offset).
 | 
			
		||||
		Limit(size).
 | 
			
		||||
		DescPk().
 | 
			
		||||
@@ -116,12 +121,34 @@ func (this *ACMEProviderAccountDAO) ListEnabledAccounts(tx *dbs.Tx, offset int64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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).
 | 
			
		||||
		State(ACMEProviderAccountStateEnabled).
 | 
			
		||||
		Attr("providerCode", providerCode).
 | 
			
		||||
		Attr("userId", userId).
 | 
			
		||||
		DescPk().
 | 
			
		||||
		Slice(&result).
 | 
			
		||||
		FindAll()
 | 
			
		||||
	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提供商
 | 
			
		||||
type ACMEProviderAccount struct {
 | 
			
		||||
	Id           uint64 `field:"id"`           // ID
 | 
			
		||||
	UserId       uint64 `field:"userId"`       // 用户ID
 | 
			
		||||
	IsOn         bool   `field:"isOn"`         // 是否启用
 | 
			
		||||
	Name         string `field:"name"`         // 名称
 | 
			
		||||
	ProviderCode string `field:"providerCode"` // 代号
 | 
			
		||||
	Error        string `field:"error"`        // 最后一条错误信息
 | 
			
		||||
	EabKid       string `field:"eabKid"`       // KID
 | 
			
		||||
	EabKey       string `field:"eabKey"`       // Key
 | 
			
		||||
	Error        string `field:"error"`        // 最后一条错误信息
 | 
			
		||||
	State        uint8  `field:"state"`        // 状态
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ACMEProviderAccountOperator struct {
 | 
			
		||||
	Id           interface{} // ID
 | 
			
		||||
	IsOn         interface{} // 是否启用
 | 
			
		||||
	Name         interface{} // 名称
 | 
			
		||||
	ProviderCode interface{} // 代号
 | 
			
		||||
	Error        interface{} // 最后一条错误信息
 | 
			
		||||
	EabKid       interface{} // KID
 | 
			
		||||
	EabKey       interface{} // Key
 | 
			
		||||
	State        interface{} // 状态
 | 
			
		||||
	Id           any // ID
 | 
			
		||||
	UserId       any // 用户ID
 | 
			
		||||
	IsOn         any // 是否启用
 | 
			
		||||
	Name         any // 名称
 | 
			
		||||
	ProviderCode any // 代号
 | 
			
		||||
	EabKid       any // KID
 | 
			
		||||
	EabKey       any // Key
 | 
			
		||||
	Error        any // 最后一条错误信息
 | 
			
		||||
	State        any // 状态
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewACMEProviderAccountOperator() *ACMEProviderAccountOperator {
 | 
			
		||||
 
 | 
			
		||||
@@ -107,7 +107,11 @@ func (this *ACMETaskDAO) DisableAllTasksWithCertId(tx *dbs.Tx, certId int64) err
 | 
			
		||||
 | 
			
		||||
// CountAllEnabledACMETasks 计算所有任务数量
 | 
			
		||||
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 {
 | 
			
		||||
		query.Gt("certId", 0)
 | 
			
		||||
 | 
			
		||||
@@ -138,7 +142,11 @@ func (this *ACMETaskDAO) CountAllEnabledACMETasks(tx *dbs.Tx, adminId int64, use
 | 
			
		||||
 | 
			
		||||
// 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) {
 | 
			
		||||
	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 {
 | 
			
		||||
		query.Gt("certId", 0)
 | 
			
		||||
 | 
			
		||||
@@ -228,7 +236,13 @@ func (this *ACMETaskDAO) UpdateACMETask(tx *dbs.Tx, acmeTaskId int64, acmeUserId
 | 
			
		||||
 | 
			
		||||
// CheckACMETask 检查权限
 | 
			
		||||
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).
 | 
			
		||||
		Pk(acmeTaskId).
 | 
			
		||||
		Exist()
 | 
			
		||||
@@ -319,7 +333,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
 | 
			
		||||
		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)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
@@ -382,7 +396,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
 | 
			
		||||
	acmeTask.Provider = acmeProvider
 | 
			
		||||
	acmeTask.Account = acmeAccount
 | 
			
		||||
 | 
			
		||||
	acmeRequest := acmeutils.NewRequest(acmeTask)
 | 
			
		||||
	var acmeRequest = acmeutils.NewRequest(acmeTask)
 | 
			
		||||
	acmeRequest.OnAuth(func(domain, token, keyAuth string) {
 | 
			
		||||
		err := SharedACMEAuthenticationDAO.CreateAuth(tx, taskId, domain, token, keyAuth)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -398,7 +412,7 @@ func (this *ACMETaskDAO) runTaskWithoutLog(tx *dbs.Tx, taskId int64) (isOk bool,
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					remotelogs.Error("ACME", "encode auth data failed: '"+task.AuthURL+"'")
 | 
			
		||||
				} 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.Header.Set("Content-Type", "application/json")
 | 
			
		||||
					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,
 | 
			
		||||
		KeyData:  keyData,
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -358,7 +358,7 @@ func (this *SSLCertDAO) FindAllExpiringCerts(tx *dbs.Tx, days int) (result []*SS
 | 
			
		||||
		days = 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	deltaSeconds := int64(days * 86400)
 | 
			
		||||
	var deltaSeconds = int64(days * 86400)
 | 
			
		||||
	_, err = this.Query(tx).
 | 
			
		||||
		State(SSLCertStateEnabled).
 | 
			
		||||
		Where("FROM_UNIXTIME(timeEndAt, '%Y-%m-%d')=:day AND FROM_UNIXTIME(notifiedAt, '%Y-%m-%d')!=:today").
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ type ACMEProviderService struct {
 | 
			
		||||
 | 
			
		||||
// FindAllACMEProviders 查找所有的服务商
 | 
			
		||||
func (this *ACMEProviderService) FindAllACMEProviders(ctx context.Context, req *pb.FindAllACMEProvidersRequest) (*pb.FindAllACMEProvidersResponse, error) {
 | 
			
		||||
	_, err := this.ValidateAdmin(ctx)
 | 
			
		||||
	_, _, err := this.ValidateAdminAndUser(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -37,7 +37,7 @@ func (this *ACMEProviderService) FindAllACMEProviders(ctx context.Context, req *
 | 
			
		||||
 | 
			
		||||
// FindACMEProviderWithCode 根据代号查找服务商
 | 
			
		||||
func (this *ACMEProviderService) FindACMEProviderWithCode(ctx context.Context, req *pb.FindACMEProviderWithCodeRequest) (*pb.FindACMEProviderWithCodeResponse, error) {
 | 
			
		||||
	_, err := this.ValidateAdmin(ctx)
 | 
			
		||||
	_, _, err := this.ValidateAdminAndUser(ctx)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,13 +16,13 @@ type ACMEProviderAccountService struct {
 | 
			
		||||
 | 
			
		||||
// CreateACMEProviderAccount 创建服务商账号
 | 
			
		||||
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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -33,13 +33,13 @@ func (this *ACMEProviderAccountService) CreateACMEProviderAccount(ctx context.Co
 | 
			
		||||
 | 
			
		||||
// FindAllACMEProviderAccountsWithProviderCode 使用代号查找服务商账号
 | 
			
		||||
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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var tx = this.NullTx()
 | 
			
		||||
	accounts, err := acme.SharedACMEProviderAccountDAO.FindAllEnabledAccountsWithProviderCode(tx, req.AcmeProviderCode)
 | 
			
		||||
	accounts, err := acme.SharedACMEProviderAccountDAO.FindAllEnabledAccountsWithProviderCode(tx, userId, req.AcmeProviderCode)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -76,12 +76,21 @@ func (this *ACMEProviderAccountService) FindAllACMEProviderAccountsWithProviderC
 | 
			
		||||
 | 
			
		||||
// UpdateACMEProviderAccount 修改服务商账号
 | 
			
		||||
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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@@ -91,12 +100,21 @@ func (this *ACMEProviderAccountService) UpdateACMEProviderAccount(ctx context.Co
 | 
			
		||||
 | 
			
		||||
// DeleteACMEProviderAccount 删除服务商账号
 | 
			
		||||
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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@@ -106,12 +124,21 @@ func (this *ACMEProviderAccountService) DeleteACMEProviderAccount(ctx context.Co
 | 
			
		||||
 | 
			
		||||
// FindEnabledACMEProviderAccount 查找单个服务商账号
 | 
			
		||||
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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@@ -147,13 +174,13 @@ func (this *ACMEProviderAccountService) FindEnabledACMEProviderAccount(ctx conte
 | 
			
		||||
 | 
			
		||||
// CountAllEnabledACMEProviderAccounts 计算所有服务商账号数量
 | 
			
		||||
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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var tx = this.NullTx()
 | 
			
		||||
	count, err := acme.SharedACMEProviderAccountDAO.CountAllEnabledAccounts(tx)
 | 
			
		||||
	count, err := acme.SharedACMEProviderAccountDAO.CountAllEnabledAccounts(tx, userId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -162,13 +189,13 @@ func (this *ACMEProviderAccountService) CountAllEnabledACMEProviderAccounts(ctx
 | 
			
		||||
 | 
			
		||||
// ListEnabledACMEProviderAccounts 列出单页服务商账号
 | 
			
		||||
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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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 {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -90,7 +90,7 @@ func (this *ACMETaskService) ListEnabledACMETasks(ctx context.Context, req *pb.L
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	result := []*pb.ACMETask{}
 | 
			
		||||
	var result = []*pb.ACMETask{}
 | 
			
		||||
	for _, task := range tasks {
 | 
			
		||||
		// ACME用户
 | 
			
		||||
		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 {
 | 
			
		||||
			// 发送消息
 | 
			
		||||
			subject := "SSL证书\"" + cert.Name + "\"在" + strconv.Itoa(days) + "天后将到期,"
 | 
			
		||||
			msg := "SSL证书\"" + cert.Name + "\"(" + string(cert.DnsNames) + ")在" + strconv.Itoa(days) + "天后将到期,"
 | 
			
		||||
			var subject = "SSL证书\"" + cert.Name + "\"在" + strconv.Itoa(days) + "天后将到期,"
 | 
			
		||||
			var msg = "SSL证书\"" + cert.Name + "\"(" + string(cert.DnsNames) + ")在" + strconv.Itoa(days) + "天后将到期,"
 | 
			
		||||
 | 
			
		||||
			// 是否有自动更新任务
 | 
			
		||||
			if cert.AcmeTaskId > 0 {
 | 
			
		||||
@@ -116,7 +116,7 @@ func (this *SSLCertExpireCheckExecutor) Loop() error {
 | 
			
		||||
						isOk, errMsg, _ := acme.SharedACMETaskDAO.RunTask(nil, int64(cert.AcmeTaskId))
 | 
			
		||||
						if isOk {
 | 
			
		||||
							// 发送成功通知
 | 
			
		||||
							subject := "系统已成功为你自动更新了证书\"" + cert.Name + "\""
 | 
			
		||||
							subject = "系统已成功为你自动更新了证书\"" + cert.Name + "\""
 | 
			
		||||
							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{
 | 
			
		||||
								"certId":     cert.Id,
 | 
			
		||||
@@ -130,7 +130,7 @@ func (this *SSLCertExpireCheckExecutor) Loop() error {
 | 
			
		||||
							}
 | 
			
		||||
						} else {
 | 
			
		||||
							// 发送失败通知
 | 
			
		||||
							subject := "系统在尝试自动更新证书\"" + cert.Name + "\"时发生错误"
 | 
			
		||||
							subject = "系统在尝试自动更新证书\"" + cert.Name + "\"时发生错误"
 | 
			
		||||
							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{
 | 
			
		||||
								"certId":     cert.Id,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user