【修复】部分方法数据链接没有正常关闭

【调整】升级lego最新版本v4.25.2
【调整】ca列表支持层级筛选
This commit is contained in:
v-me-50
2025-09-02 11:50:30 +08:00
parent de385343a8
commit efd052a297
7 changed files with 261 additions and 173 deletions

View File

@@ -44,6 +44,7 @@ func CreateIntermediateCA(c *gin.Context) {
func GetCAList(c *gin.Context) {
var form struct {
Search string `form:"search"`
Level string `form:"level"`
Page int64 `form:"p"`
Limit int64 `form:"limit"`
}
@@ -52,7 +53,7 @@ func GetCAList(c *gin.Context) {
public.FailMsg(c, err.Error())
return
}
data, count, err := private_ca.ListCAs(form.Search, form.Page, form.Limit)
data, count, err := private_ca.ListCAs(form.Search, form.Level, form.Page, form.Limit)
if err != nil {
public.FailMsg(c, err.Error())
return

View File

@@ -139,6 +139,7 @@ func AddAccount(email, ca, Kid, HmacEncoded, CADirURL string) error {
if err != nil {
return fmt.Errorf("failed to get sqlite: %w", err)
}
defer db.Close()
now := time.Now().Format("2006-01-02 15:04:05")
if (ca == "sslcom" || ca == "google") && (Kid == "" || HmacEncoded == "") {
return fmt.Errorf("Kid and HmacEncoded are required for %s CA", ca)
@@ -166,6 +167,7 @@ func UpdateAccount(id, email, ca, Kid, HmacEncoded, CADirURL string) error {
if err != nil {
return fmt.Errorf("failed to get sqlite: %w", err)
}
defer db.Close()
account := map[string]interface{}{
"email": email,
"type": ca,
@@ -186,6 +188,7 @@ func DelAccount(id string) error {
if err != nil {
return fmt.Errorf("failed to get sqlite: %w", err)
}
defer db.Close()
_, err = db.Where("id=?", []any{id}).Delete()
if err != nil {
return fmt.Errorf("failed to delete account: %w", err)
@@ -198,6 +201,7 @@ func GetAccountList(search, ca string, p, limit int64) ([]map[string]interface{}
if err != nil {
return nil, 0, fmt.Errorf("failed to get sqlite: %w", err)
}
defer db.Close()
whereSql := "1=1"
var whereArgs []any
limits := []int64{0, 100}
@@ -247,6 +251,7 @@ func GetCaList() ([]string, int, error) {
if err != nil {
return nil, 0, fmt.Errorf("failed to get sqlite: %w", err)
}
defer db.Close()
data, err := db.Field([]string{"type"}).GroupBy("type").Select()
if err != nil {
return nil, 0, fmt.Errorf("failed to get CA list: %w", err)

View File

@@ -31,6 +31,7 @@ import (
"github.com/go-acme/lego/v4/providers/dns/namesilo"
"github.com/go-acme/lego/v4/providers/dns/ns1"
"github.com/go-acme/lego/v4/providers/dns/route53"
"github.com/go-acme/lego/v4/providers/dns/spaceship"
"github.com/go-acme/lego/v4/providers/dns/tencentcloud"
"github.com/go-acme/lego/v4/providers/dns/volcengine"
"github.com/go-acme/lego/v4/providers/dns/westcn"
@@ -151,6 +152,7 @@ func GetDNSProvider(providerName string, creds map[string]string, httpClient *ht
config := route53.NewDefaultConfig()
config.AccessKeyID = creds["access_key_id"]
config.SecretAccessKey = creds["secret_access_key"]
config.Region = creds["region"]
config.PropagationTimeout = maxWait
return route53.NewDNSProviderConfig(config)
case "azure":
@@ -208,6 +210,14 @@ func GetDNSProvider(providerName string, creds map[string]string, httpClient *ht
config := webhook.NewConfig(creds)
config.PropagationTimeout = maxWait
return webhook.NewDNSProviderConfig(config)
case "spaceship":
config := spaceship.NewDefaultConfig()
config.APIKey = creds["api_key"]
config.APISecret = creds["api_secret"]
config.PropagationTimeout = maxWait
return spaceship.NewDNSProviderConfig(config)
//case "edgeone":
//config :=
default:
return nil, fmt.Errorf("不支持的 DNS Provider: %s", providerName)

View File

@@ -27,6 +27,7 @@ func CreateRootCA(name, commonName, organization, organizationalUnit, country, p
if err != nil {
return err
}
defer s.Close()
_, err = s.Insert(public.StructToMap(data, true))
if err != nil {
@@ -40,6 +41,7 @@ func CreateIntermediateCA(name, commonName, organization, organizationalUnit, co
if err != nil {
return err
}
defer s.Close()
issuers, err := s.Where("id=?", []interface{}{rootId}).Select()
if err != nil {
@@ -84,7 +86,7 @@ func DeleteCA(id int64) error {
if err != nil {
return err
}
defer s.Close()
// 检查是否有子证书
children, err := s.Where("root_id=?", []interface{}{id}).Select()
if err != nil {
@@ -94,18 +96,19 @@ func DeleteCA(id int64) error {
return fmt.Errorf("cannot delete CA with id %d: it has child CAs", id)
}
_, err = s.Where("root_id=?", []interface{}{id}).Delete()
_, err = s.Where("id=?", []interface{}{id}).Delete()
if err != nil {
return err
}
return nil
}
func ListCAs(search string, p, limit int64) ([]map[string]interface{}, int, error) {
func ListCAs(search, level string, p, limit int64) ([]map[string]interface{}, int, error) {
s, err := GetSqlite()
if err != nil {
return nil, 0, err
}
defer s.Close()
var data []map[string]any
var count int64
var limits []int64
@@ -117,14 +120,22 @@ func ListCAs(search string, p, limit int64) ([]map[string]interface{}, int, erro
limits[1] = limit
}
}
whereStr := "1=1"
var params []interface{}
if search != "" {
data, err = s.Where("name like ? or cn like ?", []interface{}{"%" + search + "%", "%" + search + "%"}).Limit(limits).Order("create_time", "desc").Select()
count, err = s.Where("name like ? or cn like ?", []interface{}{"%" + search + "%", "%" + search + "%"}).Limit(limits).Order("create_time", "desc").Count()
} else {
data, err = s.Limit(limits).Order("create_time", "desc").Select()
count, err = s.Limit(limits).Order("create_time", "desc").Count()
whereStr += " and (name like ? or cn like ?)"
params = append(params, "%"+search+"%", "%"+search+"%")
}
if level == "root" {
whereStr += " and root_id is null"
}
if level == "intermediate" {
whereStr += " and root_id is not null"
}
data, err = s.Where(whereStr, params).Limit(limits).Order("create_time", "desc").Select()
count, err = s.Where(whereStr, params).Limit(limits).Count()
if err != nil {
return data, int(count), err
}
@@ -146,8 +157,12 @@ func CreateLeafCert(caId, usage, keyBits, validDays int64, cn, san string) (*Lea
if cn == "" {
if len(sans.DNSNames) > 0 {
cn = sans.DNSNames[0]
} else {
} else if len(sans.IPAddresses) > 0 {
cn = string(sans.IPAddresses[0])
} else if len(sans.EmailAddresses) > 0 {
cn = sans.EmailAddresses[0]
} else {
return nil, fmt.Errorf("CN和SAN不能为空")
}
}
s, err := GetSqlite()
@@ -206,30 +221,44 @@ func ListLeafCerts(caId int64, search string, p, limit int64) ([]map[string]inte
var count int64
var limits []int64
if p >= 0 && limit >= 0 {
sql := `
select leaf.*, ca.name as ca_name, ca.cn as ca_cn
from leaf
left join ca on leaf.ca_id = ca.id
where 1=1
`
// 拼接查询条件
var params []interface{}
if caId > 0 {
sql += " and leaf.ca_id = ?"
params = append(params, caId)
}
if search != "" {
sql += " and (leaf.cn like ? or leaf.san like ?)"
params = append(params, "%"+search+"%", "%"+search+"%")
}
sql += " order by leaf.create_time desc"
sqlCount := "select count(id) as count from (" + sql + ")"
if p > 0 && limit > 0 {
limits = []int64{0, limit}
if p > 1 {
limits[0] = (p - 1) * limit
limits[1] = limit
}
sql += fmt.Sprintf(" limit %d offset %d", limits[1], limits[0])
}
data, err = s.Query(sql, params...)
if err != nil {
return data, 0, err
}
countResult, err := s.Query(sqlCount, params...)
if err != nil {
return data, 0, err
}
if len(countResult) > 0 {
count = countResult[0]["count"].(int64)
}
if caId > 0 && search != "" {
data, err = s.Where("ca_id=? and (cn like ? or san like ?)", []interface{}{caId, "%" + search + "%", "%" + search + "%"}).Limit(limits).Order("create_time", "desc").Select()
count, err = s.Where("ca_id=? and (cn like ? or san like ?)", []interface{}{caId, "%" + search + "%", "%" + search + "%"}).Limit(limits).Order("create_time", "desc").Count()
} else if caId > 0 {
data, err = s.Where("ca_id=?", []interface{}{caId}).Limit(limits).Order("create_time", "desc").Select()
count, err = s.Where("ca_id=?", []interface{}{caId}).Limit(limits).Order("create_time", "desc").Count()
} else if search != "" {
data, err = s.Where("cn like ? or san like ?", []interface{}{"%" + search + "%", "%" + search + "%"}).Limit(limits).Order("create_time", "desc").Select()
count, err = s.Where("cn like ? or san like ?", []interface{}{"%" + search + "%", "%" + search + "%"}).Limit(limits).Order("create_time", "desc").Count()
} else {
data, err = s.Limit(limits).Order("create_time", "desc").Select()
count, err = s.Limit(limits).Order("create_time", "desc").Count()
}
if err != nil {
return data, int(count), err
}
return data, int(count), nil
}

View File

@@ -370,6 +370,61 @@ create table monitor
on err_record (monitor_id);
`)
dbPrivateCa, err := sql.Open("sqlite", "data/private_ca.db")
if err != nil {
// fmt.Println("创建 private_ca 数据库失败:", err)
return
}
defer dbPrivateCa.Close()
// 创建表
_, err = dbPrivateCa.Exec(`
PRAGMA journal_mode=WAL;
create table if not exists ca
(
id integer not null
constraint ca_pk
primary key autoincrement,
root_id integer,
name TEXT not null,
cn TEXT not null,
o TEXT not null,
c TEXT not null,
cert TEXT not null,
key TEXT not null,
en_cert TEXT,
en_key TEXT,
algorithm TEXT not null,
key_length integer,
not_before TEXT not null,
not_after TEXT not null,
create_time TEXT not null
);
create index ca_root_id_index
on ca (root_id);
create table leaf
(
id integer not null
constraint leaf_pk
primary key autoincrement,
ca_id integer not null,
cn TEXT not null,
san TEXT not null,
usage integer not null,
cert TEXT not null,
key TEXT not null,
en_cert TEXT,
en_key TEXT,
algorithm TEXT not null,
key_length integer,
not_before TEXT not null,
not_after TEXT not null,
create_time TEXT not null
);
create index leaf_ca_id_index
on leaf (ca_id);
`)
}
func insertDefaultData(db *sql.DB, table, insertSQL string) {