用户系统也可以申请ACME证书

This commit is contained in:
GoEdgeLab
2022-08-28 20:02:13 +08:00
parent dd43ef751b
commit 88ec3f5d13
11 changed files with 118 additions and 48 deletions

View File

@@ -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())

View File

@@ -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,
} }

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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,
} }

View File

@@ -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").

View File

@@ -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
} }

View File

@@ -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
} }

View File

@@ -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

View File

@@ -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,