diff --git a/backend/app/api/v1/entry.go b/backend/app/api/v1/entry.go index 852403e89..20ab8d060 100644 --- a/backend/app/api/v1/entry.go +++ b/backend/app/api/v1/entry.go @@ -32,7 +32,10 @@ var ( operationService = service.ServiceGroupApp.OperationService commandService = service.ServiceGroupApp.CommandService + websiteGroupService = service.ServiceGroupApp.WebsiteGroupService websiteService = service.ServiceGroupApp.WebsiteService - webSiteDnsAccountService = service.ServiceGroupApp.WebSiteDnsAccountService + websiteDnsAccountService = service.ServiceGroupApp.WebSiteDnsAccountService + websiteSSLService = service.ServiceGroupApp.WebSiteSSLService + websiteAcmeAccountService = service.ServiceGroupApp.WebSiteAcmeAccountService ) diff --git a/backend/app/api/v1/website_acme_account.go b/backend/app/api/v1/website_acme_account.go new file mode 100644 index 000000000..b3e381dcd --- /dev/null +++ b/backend/app/api/v1/website_acme_account.go @@ -0,0 +1,54 @@ +package v1 + +import ( + "github.com/1Panel-dev/1Panel/backend/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/backend/app/dto" + "github.com/1Panel-dev/1Panel/backend/constant" + "github.com/gin-gonic/gin" +) + +func (b *BaseApi) PageWebsiteAcmeAccount(c *gin.Context) { + var req dto.PageInfo + if err := c.ShouldBindJSON(&req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + total, accounts, err := websiteAcmeAccountService.Page(req) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, dto.PageResult{ + Total: total, + Items: accounts, + }) +} + +func (b *BaseApi) CreateWebsiteAcmeAccount(c *gin.Context) { + var req dto.WebsiteAcmeAccountCreate + if err := c.ShouldBindJSON(&req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + res, err := websiteAcmeAccountService.Create(req) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, res) +} + +func (b *BaseApi) DeleteWebsiteAcmeAccount(c *gin.Context) { + + id, err := helper.GetParamID(c) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + + if err := websiteAcmeAccountService.Delete(id); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, nil) +} diff --git a/backend/app/api/v1/website_dns_account.go b/backend/app/api/v1/website_dns_account.go index 0e6d201b2..d188b02fe 100644 --- a/backend/app/api/v1/website_dns_account.go +++ b/backend/app/api/v1/website_dns_account.go @@ -13,7 +13,7 @@ func (b *BaseApi) PageWebsiteDnsAccount(c *gin.Context) { helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) return } - total, accounts, err := webSiteDnsAccountService.Page(req) + total, accounts, err := websiteDnsAccountService.Page(req) if err != nil { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return @@ -30,7 +30,7 @@ func (b *BaseApi) CreateWebsiteDnsAccount(c *gin.Context) { helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) return } - if _, err := webSiteDnsAccountService.Create(req); err != nil { + if _, err := websiteDnsAccountService.Create(req); err != nil { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return } @@ -43,7 +43,7 @@ func (b *BaseApi) UpdateWebsiteDnsAccount(c *gin.Context) { helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) return } - if _, err := webSiteDnsAccountService.Update(req); err != nil { + if _, err := websiteDnsAccountService.Update(req); err != nil { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return } @@ -58,7 +58,7 @@ func (b *BaseApi) DeleteWebsiteDnsAccount(c *gin.Context) { return } - if err := webSiteDnsAccountService.Delete(id); err != nil { + if err := websiteDnsAccountService.Delete(id); err != nil { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return } diff --git a/backend/app/api/v1/website_ssl.go b/backend/app/api/v1/website_ssl.go new file mode 100644 index 000000000..a8fd76fe4 --- /dev/null +++ b/backend/app/api/v1/website_ssl.go @@ -0,0 +1,66 @@ +package v1 + +import ( + "github.com/1Panel-dev/1Panel/backend/app/api/v1/helper" + "github.com/1Panel-dev/1Panel/backend/app/dto" + "github.com/1Panel-dev/1Panel/backend/constant" + "github.com/gin-gonic/gin" +) + +func (b *BaseApi) PageWebsiteSSL(c *gin.Context) { + var req dto.PageInfo + if err := c.ShouldBindJSON(&req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) + return + } + total, accounts, err := websiteSSLService.Page(req) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, dto.PageResult{ + Total: total, + Items: accounts, + }) +} + +//func (b *BaseApi) CreateWebsiteSSL(c *gin.Context) { +// var req dto.WebsiteSSLCreate +// if err := c.ShouldBindJSON(&req); err != nil { +// helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) +// return +// } +// if _, err := WebsiteSSLService.Create(req); err != nil { +// helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) +// return +// } +// helper.SuccessWithData(c, nil) +//} +// +//func (b *BaseApi) UpdateWebsiteSSL(c *gin.Context) { +// var req dto.WebsiteSSLUpdate +// if err := c.ShouldBindJSON(&req); err != nil { +// helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) +// return +// } +// if _, err := WebsiteSSLService.Update(req); err != nil { +// helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) +// return +// } +// helper.SuccessWithData(c, nil) +//} +// +//func (b *BaseApi) DeleteWebsiteSSL(c *gin.Context) { +// +// id, err := helper.GetParamID(c) +// if err != nil { +// helper.ErrorWithDetail(c, constant.CodeErrBadRequest, constant.ErrTypeInvalidParams, err) +// return +// } +// +// if err := WebsiteSSLService.Delete(id); err != nil { +// helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) +// return +// } +// helper.SuccessWithData(c, nil) +//} diff --git a/backend/app/dto/website_acme_account.go b/backend/app/dto/website_acme_account.go new file mode 100644 index 000000000..1a9272914 --- /dev/null +++ b/backend/app/dto/website_acme_account.go @@ -0,0 +1,11 @@ +package dto + +import "github.com/1Panel-dev/1Panel/backend/app/model" + +type WebsiteAcmeAccountDTO struct { + model.WebsiteAcmeAccount +} + +type WebsiteAcmeAccountCreate struct { + Email string `json:"email" validate:"required"` +} diff --git a/backend/app/dto/website_ssl.go b/backend/app/dto/website_ssl.go new file mode 100644 index 000000000..d2e372522 --- /dev/null +++ b/backend/app/dto/website_ssl.go @@ -0,0 +1,13 @@ +package dto + +import "github.com/1Panel-dev/1Panel/backend/app/model" + +type WebsiteSSLDTO struct { + model.WebSiteSSL +} + +type WebsiteSSLCreate struct { + Name string `json:"name" validate:"required"` + Type string `json:"type" validate:"required"` + Authorization map[string]string `json:"authorization" validate:"required"` +} diff --git a/backend/app/model/website.go b/backend/app/model/website.go index a467c5cd1..e51051ed0 100644 --- a/backend/app/model/website.go +++ b/backend/app/model/website.go @@ -4,13 +4,19 @@ import "time" type WebSite struct { BaseModel - PrimaryDomain string `gorm:"type:varchar(128);not null" json:"primaryDomain"` - Type string `gorm:"type:varchar(64);not null" json:"type"` - Alias string `gorm:"type:varchar(128);not null" json:"alias"` - Remark string `gorm:"type:longtext;" json:"remark"` - Status string `gorm:"type:varchar(64);not null" json:"status"` - ExpireDate time.Time `json:"expireDate"` - AppInstallID uint `gorm:"type:integer" json:"appInstallID"` - WebSiteGroupID uint `gorm:"type:integer" json:"webSiteGroupID"` - WebSiteSSLID uint `gorm:"type:integer" json:"webSiteSSLID"` + PrimaryDomain string `gorm:"type:varchar(128);not null" json:"primaryDomain"` + Type string `gorm:"type:varchar(64);not null" json:"type"` + Alias string `gorm:"type:varchar(128);not null" json:"alias"` + Remark string `gorm:"type:longtext;" json:"remark"` + Status string `gorm:"type:varchar(64);not null" json:"status"` + ExpireDate time.Time `json:"expireDate"` + AppInstallID uint `gorm:"type:integer" json:"appInstallId"` + WebSiteGroupID uint `gorm:"type:integer" json:"webSiteGroupId"` + WebSiteSSLID uint `gorm:"type:integer" json:"webSiteSSLId"` + WebsiteDnsAccountID uint `gorm:"type:integer" json:"websiteDnsAccountId"` + WebsiteAcmeAccountID uint `gorm:"type:integer" json:"websiteAcmeAccountId"` +} + +func (w WebSite) TableName() string { + return "websites" } diff --git a/backend/app/model/website_acme_account.go b/backend/app/model/website_acme_account.go new file mode 100644 index 000000000..0dc807cb6 --- /dev/null +++ b/backend/app/model/website_acme_account.go @@ -0,0 +1,12 @@ +package model + +type WebsiteAcmeAccount struct { + BaseModel + Email string `gorm:"type:varchar(256);not null" json:"email"` + URL string `gorm:"type:varchar(256);not null" json:"url"` + PrivateKey string `gorm:"type:longtext;not null" json:"_"` +} + +func (w WebsiteAcmeAccount) TableName() string { + return "website_acme_accounts" +} diff --git a/backend/app/model/website_dns_account.go b/backend/app/model/website_dns_account.go index bd67729f2..a4ae1bdac 100644 --- a/backend/app/model/website_dns_account.go +++ b/backend/app/model/website_dns_account.go @@ -6,3 +6,7 @@ type WebsiteDnsAccount struct { Type string `gorm:"type:varchar(64);not null" json:"type"` Authorization string `gorm:"type:varchar(256);not null" json:"_"` } + +func (w WebsiteDnsAccount) TableName() string { + return "website_dns_accounts" +} diff --git a/backend/app/model/website_domain.go b/backend/app/model/website_domain.go index b81dd2aab..6c54a4ccb 100644 --- a/backend/app/model/website_domain.go +++ b/backend/app/model/website_domain.go @@ -6,3 +6,7 @@ type WebSiteDomain struct { Domain string `gorm:"type:varchar(256);not null" json:"domain"` Port int `gorm:"type:integer" json:"port"` } + +func (w WebSiteDomain) TableName() string { + return "website_domains" +} diff --git a/backend/app/model/website_group.go b/backend/app/model/website_group.go index a54809cac..166127dcd 100644 --- a/backend/app/model/website_group.go +++ b/backend/app/model/website_group.go @@ -5,3 +5,7 @@ type WebSiteGroup struct { Name string `gorm:"type:varchar(64);not null" json:"name"` Default bool `json:"default"` } + +func (w WebSiteGroup) TableName() string { + return "website_groups" +} diff --git a/backend/app/model/website_ssl.go b/backend/app/model/website_ssl.go index 7bd9f7266..b8fdd8f89 100644 --- a/backend/app/model/website_ssl.go +++ b/backend/app/model/website_ssl.go @@ -1,5 +1,19 @@ package model +import "time" + type WebSiteSSL struct { BaseModel + PrivateKey string `gorm:"type:longtext;not null" json:"privateKey"` + Pem string `gorm:"type:longtext;not null" json:"pem"` + Domain string `gorm:"type:varchar(256);not null" json:"domain"` + CertURL string `gorm:"type:varchar(256);not null" json:"certURL"` + Type string `gorm:"type:varchar(64);not null" json:"type"` + IssuerName string `gorm:"type:varchar(64);not null" json:"issuerName"` + ExpireDate time.Time `json:"expireDate"` + StartDate time.Time `json:"startDate"` +} + +func (w WebSiteSSL) TableName() string { + return "website_ssls" } diff --git a/backend/app/repo/entry.go b/backend/app/repo/entry.go index 50e643d74..0134e3f66 100644 --- a/backend/app/repo/entry.go +++ b/backend/app/repo/entry.go @@ -24,6 +24,8 @@ type RepoGroup struct { WebSiteDomainRepo WebSiteGroupRepo WebsiteDnsAccountRepo + WebsiteSSLRepo + WebsiteAcmeAccountRepo } var RepoGroupApp = new(RepoGroup) diff --git a/backend/app/repo/website_acme_account.go b/backend/app/repo/website_acme_account.go new file mode 100644 index 000000000..19bd212af --- /dev/null +++ b/backend/app/repo/website_acme_account.go @@ -0,0 +1,27 @@ +package repo + +import "github.com/1Panel-dev/1Panel/backend/app/model" + +type WebsiteAcmeAccountRepo struct { +} + +func (w WebsiteAcmeAccountRepo) Page(page, size int, opts ...DBOption) (int64, []model.WebsiteAcmeAccount, error) { + var accounts []model.WebsiteAcmeAccount + db := getDb(opts...).Model(&model.WebsiteAcmeAccount{}) + count := int64(0) + db = db.Count(&count) + err := db.Debug().Limit(size).Offset(size * (page - 1)).Find(&accounts).Error + return count, accounts, err +} + +func (w WebsiteAcmeAccountRepo) Create(account model.WebsiteAcmeAccount) error { + return getDb().Create(&account).Error +} + +func (w WebsiteAcmeAccountRepo) Save(account model.WebsiteAcmeAccount) error { + return getDb().Save(&account).Error +} + +func (w WebsiteAcmeAccountRepo) DeleteBy(opts ...DBOption) error { + return getDb(opts...).Debug().Delete(&model.WebsiteAcmeAccount{}).Error +} diff --git a/backend/app/repo/website_ssl.go b/backend/app/repo/website_ssl.go new file mode 100644 index 000000000..f17233ffe --- /dev/null +++ b/backend/app/repo/website_ssl.go @@ -0,0 +1,27 @@ +package repo + +import "github.com/1Panel-dev/1Panel/backend/app/model" + +type WebsiteSSLRepo struct { +} + +func (w WebsiteSSLRepo) Page(page, size int, opts ...DBOption) (int64, []model.WebSiteSSL, error) { + var sslList []model.WebSiteSSL + db := getDb(opts...).Model(&model.WebSiteSSL{}) + count := int64(0) + db = db.Count(&count) + err := db.Debug().Limit(size).Offset(size * (page - 1)).Find(&sslList).Error + return count, sslList, err +} + +func (w WebsiteSSLRepo) Create(ssl model.WebSiteSSL) error { + return getDb().Create(&ssl).Error +} + +func (w WebsiteSSLRepo) Save(ssl model.WebSiteSSL) error { + return getDb().Save(&ssl).Error +} + +func (w WebsiteSSLRepo) DeleteBy(opts ...DBOption) error { + return getDb(opts...).Delete(&model.WebSiteSSL{}).Error +} diff --git a/backend/app/service/entry.go b/backend/app/service/entry.go index 6258a2c8d..002bf859b 100644 --- a/backend/app/service/entry.go +++ b/backend/app/service/entry.go @@ -29,6 +29,8 @@ type ServiceGroup struct { WebsiteGroupService WebsiteService WebSiteDnsAccountService + WebSiteSSLService + WebSiteAcmeAccountService } var ServiceGroupApp = new(ServiceGroup) @@ -64,4 +66,6 @@ var ( websiteGroupRepo = repo.RepoGroupApp.WebSiteGroupRepo websiteDomainRepo = repo.RepoGroupApp.WebSiteDomainRepo websiteDnsRepo = repo.RepoGroupApp.WebsiteDnsAccountRepo + websiteSSLRepo = repo.RepoGroupApp.WebsiteSSLRepo + websiteAcmeRepo = repo.RepoGroupApp.WebsiteAcmeAccountRepo ) diff --git a/backend/app/service/website_acme_account.go b/backend/app/service/website_acme_account.go new file mode 100644 index 000000000..1fef6ea01 --- /dev/null +++ b/backend/app/service/website_acme_account.go @@ -0,0 +1,41 @@ +package service + +import ( + "github.com/1Panel-dev/1Panel/backend/app/dto" + "github.com/1Panel-dev/1Panel/backend/app/model" + "github.com/1Panel-dev/1Panel/backend/utils/ssl" +) + +type WebSiteAcmeAccountService struct { +} + +func (w WebSiteAcmeAccountService) Page(search dto.PageInfo) (int64, []dto.WebsiteAcmeAccountDTO, error) { + total, accounts, err := websiteAcmeRepo.Page(search.Page, search.PageSize, commonRepo.WithOrderBy("created_at desc")) + var accountDTOs []dto.WebsiteAcmeAccountDTO + for _, account := range accounts { + accountDTOs = append(accountDTOs, dto.WebsiteAcmeAccountDTO{ + WebsiteAcmeAccount: account, + }) + } + return total, accountDTOs, err +} + +func (w WebSiteAcmeAccountService) Create(create dto.WebsiteAcmeAccountCreate) (dto.WebsiteAcmeAccountDTO, error) { + client, err := ssl.NewAcmeClient(create.Email, "") + if err != nil { + return dto.WebsiteAcmeAccountDTO{}, err + } + acmeAccount := model.WebsiteAcmeAccount{ + Email: create.Email, + URL: client.User.Registration.URI, + PrivateKey: string(ssl.GetPrivateKey(client.User.GetPrivateKey())), + } + if err := websiteAcmeRepo.Create(acmeAccount); err != nil { + return dto.WebsiteAcmeAccountDTO{}, err + } + return dto.WebsiteAcmeAccountDTO{WebsiteAcmeAccount: acmeAccount}, nil +} + +func (w WebSiteAcmeAccountService) Delete(id uint) error { + return websiteAcmeRepo.DeleteBy(commonRepo.WithByID(id)) +} diff --git a/backend/app/service/website_ssl.go b/backend/app/service/website_ssl.go new file mode 100644 index 000000000..9e6a4a745 --- /dev/null +++ b/backend/app/service/website_ssl.go @@ -0,0 +1,62 @@ +package service + +import ( + "github.com/1Panel-dev/1Panel/backend/app/dto" +) + +type WebSiteSSLService struct { +} + +func (w WebSiteSSLService) Page(search dto.PageInfo) (int64, []dto.WebsiteSSLDTO, error) { + total, sslList, err := websiteSSLRepo.Page(search.Page, search.PageSize, commonRepo.WithOrderBy("created_at desc")) + var sslDTOs []dto.WebsiteSSLDTO + for _, ssl := range sslList { + sslDTOs = append(sslDTOs, dto.WebsiteSSLDTO{ + WebSiteSSL: ssl, + }) + } + return total, sslDTOs, err +} + +//func (w WebSiteSSLService) Create(create dto.WebsiteSSLCreate) (dto.WebsiteSSLCreate, error) { +// +// authorization, err := json.Marshal(create.Authorization) +// if err != nil { +// return dto.WebsiteSSLCreate{}, err +// } +// +// if err := websiteSSLRepo.Create(model.WebsiteDnsAccount{ +// Name: create.Name, +// Type: create.Type, +// Authorization: string(authorization), +// }); err != nil { +// return dto.WebsiteSSLCreate{}, err +// } +// +// return create, nil +//} +// +//func (w WebSiteSSLService) Update(update dto.WebsiteDnsAccountUpdate) (dto.WebsiteDnsAccountUpdate, error) { +// +// authorization, err := json.Marshal(update.Authorization) +// if err != nil { +// return dto.WebsiteDnsAccountUpdate{}, err +// } +// +// if err := websiteSSLRepo.Save(model.WebsiteDnsAccount{ +// BaseModel: model.BaseModel{ +// ID: update.ID, +// }, +// Name: update.Name, +// Type: update.Type, +// Authorization: string(authorization), +// }); err != nil { +// return dto.WebsiteDnsAccountUpdate{}, err +// } +// +// return update, nil +//} + +func (w WebSiteSSLService) Delete(id uint) error { + return websiteSSLRepo.DeleteBy(commonRepo.WithByID(id)) +} diff --git a/backend/init/migration/migrate.go b/backend/init/migration/migrate.go index c5d2701cd..89fc76b44 100644 --- a/backend/init/migration/migrate.go +++ b/backend/init/migration/migrate.go @@ -18,7 +18,6 @@ func Init() { migrations.AddTableApp, migrations.AddTableImageRepo, migrations.AddTableWebsite, - migrations.AddTableDnsAccount, migrations.AddTableDatabaseMysql, }) if err := m.Migrate(); err != nil { diff --git a/backend/init/migration/migrations/init.go b/backend/init/migration/migrations/init.go index 1356da214..797d28dba 100644 --- a/backend/init/migration/migrations/init.go +++ b/backend/init/migration/migrations/init.go @@ -181,7 +181,7 @@ var AddTableDatabaseMysql = &gormigrate.Migration{ var AddTableWebsite = &gormigrate.Migration{ ID: "20201009-add-table-website", Migrate: func(tx *gorm.DB) error { - if err := tx.AutoMigrate(&model.WebSite{}, &model.WebSiteDomain{}, &model.WebSiteGroup{}); err != nil { + if err := tx.AutoMigrate(&model.WebSite{}, &model.WebSiteDomain{}, &model.WebSiteGroup{}, &model.WebsiteDnsAccount{}, &model.WebSiteSSL{}, &model.WebsiteAcmeAccount{}); err != nil { return err } item := &model.WebSiteGroup{ @@ -194,13 +194,3 @@ var AddTableWebsite = &gormigrate.Migration{ return nil }, } - -var AddTableDnsAccount = &gormigrate.Migration{ - ID: "20201009-add-table-dns", - Migrate: func(tx *gorm.DB) error { - if err := tx.AutoMigrate(&model.WebsiteDnsAccount{}); err != nil { - return err - } - return nil - }, -} diff --git a/backend/init/router/router.go b/backend/init/router/router.go index 3559a1513..5aa9cf101 100644 --- a/backend/init/router/router.go +++ b/backend/init/router/router.go @@ -83,6 +83,7 @@ func Routers() *gin.Engine { systemRouter.InitWebsiteGroupRouter(PrivateGroup) systemRouter.InitWebsiteDnsAccountRouter(PrivateGroup) systemRouter.InitDatabaseRouter(PrivateGroup) + systemRouter.InitWebsiteAcmeAccountRouter(PrivateGroup) } return Router diff --git a/backend/router/entry.go b/backend/router/entry.go index a45f799fd..e17d19831 100644 --- a/backend/router/entry.go +++ b/backend/router/entry.go @@ -17,6 +17,7 @@ type RouterGroup struct { WebsiteRouter WebsiteGroupRouter WebsiteDnsAccountRouter + WebsiteAcmeAccountRouter DatabaseRouter } diff --git a/backend/router/ro_website_acme_account.go b/backend/router/ro_website_acme_account.go new file mode 100644 index 000000000..540482b22 --- /dev/null +++ b/backend/router/ro_website_acme_account.go @@ -0,0 +1,22 @@ +package router + +import ( + v1 "github.com/1Panel-dev/1Panel/backend/app/api/v1" + "github.com/1Panel-dev/1Panel/backend/middleware" + "github.com/gin-gonic/gin" +) + +type WebsiteAcmeAccountRouter struct { +} + +func (a *WebsiteAcmeAccountRouter) InitWebsiteAcmeAccountRouter(Router *gin.RouterGroup) { + groupRouter := Router.Group("websites/acme") + groupRouter.Use(middleware.JwtAuth()).Use(middleware.SessionAuth()) + + baseApi := v1.ApiGroupApp.BaseApi + { + groupRouter.POST("/search", baseApi.PageWebsiteAcmeAccount) + groupRouter.POST("", baseApi.CreateWebsiteAcmeAccount) + groupRouter.DELETE("/:id", baseApi.DeleteWebsiteAcmeAccount) + } +} diff --git a/backend/router/ro_website_ssl.go b/backend/router/ro_website_ssl.go new file mode 100644 index 000000000..610091a0c --- /dev/null +++ b/backend/router/ro_website_ssl.go @@ -0,0 +1,21 @@ +package router + +import ( + v1 "github.com/1Panel-dev/1Panel/backend/app/api/v1" + "github.com/1Panel-dev/1Panel/backend/middleware" + "github.com/gin-gonic/gin" +) + +type WebsiteSSLRouter struct { +} + +func (a *WebsiteSSLRouter) InitWebsiteSSLRouter(Router *gin.RouterGroup) { + groupRouter := Router.Group("websites/ssl") + groupRouter.Use(middleware.JwtAuth()).Use(middleware.SessionAuth()) + + baseApi := v1.ApiGroupApp.BaseApi + { + groupRouter.POST("", baseApi.PageWebsiteSSL) + + } +} diff --git a/backend/utils/nginx/private.key b/backend/utils/nginx/private.key index d6080982f..5205a689a 100644 --- a/backend/utils/nginx/private.key +++ b/backend/utils/nginx/private.key @@ -1,27 +1,27 @@ -----BEGIN privateKey----- -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 -----END privateKey----- diff --git a/backend/utils/ssl/acme.go b/backend/utils/ssl/acme.go index 06ddc4d02..22302199d 100644 --- a/backend/utils/ssl/acme.go +++ b/backend/utils/ssl/acme.go @@ -1,6 +1,7 @@ package ssl import ( + "crypto" "crypto/rand" "crypto/rsa" "crypto/x509" @@ -10,8 +11,9 @@ import ( "github.com/go-acme/lego/v4/registration" ) -func GetPrivateKey(priKey *rsa.PrivateKey) []byte { - derStream := x509.MarshalPKCS1PrivateKey(priKey) +func GetPrivateKey(priKey crypto.PrivateKey) []byte { + rsaKey := priKey.(*rsa.PrivateKey) + derStream := x509.MarshalPKCS1PrivateKey(rsaKey) block := &pem.Block{ Type: "privateKey", Bytes: derStream, @@ -25,9 +27,10 @@ func NewRegisterClient(email string) (*AcmeClient, error) { if err != nil { panic(err) } + myUser := &AcmeUser{ Email: email, - key: priKey, + Key: priKey, } config := newConfig(myUser) client, err := lego.NewClient(config) @@ -58,7 +61,7 @@ func NewPrivateKeyClient(email string, privateKey string) (*AcmeClient, error) { } myUser := &AcmeUser{ Email: email, - key: priKey, + Key: priKey, } config := newConfig(myUser) client, err := lego.NewClient(config) diff --git a/backend/utils/ssl/client.go b/backend/utils/ssl/client.go index f2b6b5cd9..7ac3e5fd0 100644 --- a/backend/utils/ssl/client.go +++ b/backend/utils/ssl/client.go @@ -16,7 +16,7 @@ import ( type AcmeUser struct { Email string Registration *registration.Resource - key crypto.PrivateKey + Key crypto.PrivateKey } func (u *AcmeUser) GetEmail() string { @@ -27,7 +27,7 @@ func (u *AcmeUser) GetRegistration() *registration.Resource { return u.Registration } func (u *AcmeUser) GetPrivateKey() crypto.PrivateKey { - return u.key + return u.Key } type AcmeClient struct { diff --git a/frontend/src/api/interface/website.ts b/frontend/src/api/interface/website.ts index 2ce68f08e..4b0462257 100644 --- a/frontend/src/api/interface/website.ts +++ b/frontend/src/api/interface/website.ts @@ -8,15 +8,15 @@ export namespace WebSite { remark: string; domains: string[]; appType: string; - appInstallID?: number; - webSiteGroupID: number; + appInstallId?: number; + webSiteGroupId: number; otherDomains: string; appinstall?: NewAppInstall; } export interface NewAppInstall { name: string; - appDetailID: number; + appDetailId: number; params: any; } @@ -36,8 +36,8 @@ export namespace WebSite { alias: string; remark: string; appType: string; - appInstallID: number; - webSiteGroupID: number; + appInstallId: number; + webSiteGroupId: number; otherDomains: string; } @@ -45,7 +45,7 @@ export namespace WebSite { id: number; primaryDomain: string; remark: string; - webSiteGroupID: number; + webSiteGroupId: number; } export interface Group extends CommonModel { @@ -103,4 +103,24 @@ export namespace WebSite { type: string; authorization: Object; } + + export interface SSL extends CommonModel { + privateKey: string; + pem: string; + domain: string; + certURL: string; + type: string; + issuerName: string; + expireDate: string; + startDate: string; + } + + export interface AcmeAccount extends CommonModel { + email: string; + url: string; + } + + export interface AcmeAccountCreate { + email: string; + } } diff --git a/frontend/src/api/modules/website.ts b/frontend/src/api/modules/website.ts index 739b75916..e9f8d90a6 100644 --- a/frontend/src/api/modules/website.ts +++ b/frontend/src/api/modules/website.ts @@ -73,3 +73,19 @@ export const UpdateDnsAccount = (req: WebSite.DnsAccountUpdate) => { export const DeleteDnsAccount = (id: number) => { return http.delete(`/websites/dns/${id}`); }; + +export const SearchSSL = (req: ReqPage) => { + return http.post>(`/websites/ssl`, req); +}; + +export const SearchAcmeAccount = (req: ReqPage) => { + return http.post>(`/websites/acme/search`, req); +}; + +export const CreateAcmeAccount = (req: WebSite.AcmeAccountCreate) => { + return http.post(`/websites/acme`, req); +}; + +export const DeleteAcmeAccount = (id: number) => { + return http.delete(`/websites/acme/${id}`); +}; diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 66847a0e0..027ac307c 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -704,5 +704,8 @@ export default { manual: '手动解析', key: '密钥', check: '查看', + accountManage: '账户管理', + email: '邮箱', + addAccount: '新增账户', }, }; diff --git a/frontend/src/views/website/project/config/basic/other/index.vue b/frontend/src/views/website/project/config/basic/other/index.vue index da6508e41..f8f05618c 100644 --- a/frontend/src/views/website/project/config/basic/other/index.vue +++ b/frontend/src/views/website/project/config/basic/other/index.vue @@ -13,7 +13,7 @@ - + ([]); @@ -91,7 +91,7 @@ const search = () => { // form.id = res.data.id; form.primaryDomain = res.data.primaryDomain; form.remark = res.data.remark; - form.webSiteGroupID = res.data.webSiteGroupID; + form.webSiteGroupId = res.data.webSiteGroupId; }); }); }; diff --git a/frontend/src/views/website/project/config/ssl/account/create/index.vue b/frontend/src/views/website/project/config/ssl/account/create/index.vue index 1077fe675..520535a49 100644 --- a/frontend/src/views/website/project/config/ssl/account/create/index.vue +++ b/frontend/src/views/website/project/config/ssl/account/create/index.vue @@ -59,10 +59,6 @@ const accountData = ref({ }); const types = [ - { - label: i18n.global.t('website.manual'), - value: 'Manual', - }, { label: 'DnsPod', value: 'DnsPod', @@ -93,7 +89,7 @@ let rules = ref({ let account = ref({ id: 0, name: '', - type: '', + type: 'DnsPod', authorization: {}, }); const em = defineEmits(['close']); @@ -108,14 +104,13 @@ const resetForm = () => { account.value = { id: 0, name: '', - type: '', + type: 'DnsPod', authorization: {}, }; accountForm.value?.resetFields(); }; const acceptParams = async (props: AccountProps) => { - resetForm(); accountData.value.mode = props.mode; if (props.mode === 'edit') { account.value = props.form; diff --git a/frontend/src/views/website/project/config/ssl/index.vue b/frontend/src/views/website/project/config/ssl/index.vue index 1b34b3014..33179ff70 100644 --- a/frontend/src/views/website/project/config/ssl/index.vue +++ b/frontend/src/views/website/project/config/ssl/index.vue @@ -6,8 +6,9 @@ - - + + + @@ -15,6 +16,7 @@ import { computed, ref } from 'vue'; import Current from './current/index.vue'; import Account from './account/index.vue'; +import SSL from './ssl/index.vue'; const props = defineProps({ id: { diff --git a/frontend/src/views/website/project/config/ssl/ssl/account/create/index.vue b/frontend/src/views/website/project/config/ssl/ssl/account/create/index.vue new file mode 100644 index 000000000..590397347 --- /dev/null +++ b/frontend/src/views/website/project/config/ssl/ssl/account/create/index.vue @@ -0,0 +1,78 @@ + + diff --git a/frontend/src/views/website/project/config/ssl/ssl/account/index.vue b/frontend/src/views/website/project/config/ssl/ssl/account/index.vue new file mode 100644 index 000000000..c87a995b2 --- /dev/null +++ b/frontend/src/views/website/project/config/ssl/ssl/account/index.vue @@ -0,0 +1,78 @@ + + diff --git a/frontend/src/views/website/project/config/ssl/ssl/index.vue b/frontend/src/views/website/project/config/ssl/ssl/index.vue new file mode 100644 index 000000000..933f2d896 --- /dev/null +++ b/frontend/src/views/website/project/config/ssl/ssl/index.vue @@ -0,0 +1,46 @@ + + +