From fc0efc490ea6b1cb0eb2d67d9ea4ccbc0111ab94 Mon Sep 17 00:00:00 2001
From: yumaojun03 <719118794@qq.com>
Date: Sun, 9 Mar 2025 16:24:14 +0800
Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85API=20=E4=B8=8E=E8=84=B1?=
=?UTF-8?q?=E6=95=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
devcloud-mini/cmdb/apps/registry.go | 2 +
devcloud-mini/cmdb/apps/secret/api/api.go | 88 +++++++++++++++++++
.../cmdb/apps/secret/impl/impl_test.go | 17 ++++
.../cmdb/apps/secret/impl/secret_test.go | 40 +++++++++
devcloud-mini/cmdb/apps/secret/model.go | 27 ++++--
devcloud-mini/cmdb/docs/design.drawio | 25 ++++--
go.mod | 2 +-
go.sum | 4 +-
8 files changed, 186 insertions(+), 19 deletions(-)
create mode 100644 devcloud-mini/cmdb/apps/secret/api/api.go
create mode 100644 devcloud-mini/cmdb/apps/secret/impl/impl_test.go
create mode 100644 devcloud-mini/cmdb/apps/secret/impl/secret_test.go
diff --git a/devcloud-mini/cmdb/apps/registry.go b/devcloud-mini/cmdb/apps/registry.go
index f71dd5e..caef9c7 100644
--- a/devcloud-mini/cmdb/apps/registry.go
+++ b/devcloud-mini/cmdb/apps/registry.go
@@ -3,4 +3,6 @@ package apps
import (
_ "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/resource/api"
_ "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/resource/impl"
+ _ "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/secret/api"
+ _ "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/secret/impl"
)
diff --git a/devcloud-mini/cmdb/apps/secret/api/api.go b/devcloud-mini/cmdb/apps/secret/api/api.go
new file mode 100644
index 0000000..aeb79fe
--- /dev/null
+++ b/devcloud-mini/cmdb/apps/secret/api/api.go
@@ -0,0 +1,88 @@
+package api
+
+import (
+ restfulspec "github.com/emicklei/go-restful-openapi/v2"
+ "github.com/emicklei/go-restful/v3"
+ "github.com/gin-gonic/gin/binding"
+ "github.com/infraboard/mcube/v2/exception"
+ "github.com/infraboard/mcube/v2/http/restful/response"
+ "github.com/infraboard/mcube/v2/ioc"
+ "github.com/infraboard/mcube/v2/ioc/config/gorestful"
+ "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/secret"
+)
+
+func init() {
+ ioc.Api().Registry(&SecretApiHandler{})
+}
+
+type SecretApiHandler struct {
+ ioc.ObjectImpl
+}
+
+func (r *SecretApiHandler) Name() string {
+ return secret.AppName
+}
+
+func (r *SecretApiHandler) Init() error {
+ // WebService ws
+ // api/v1/resource
+ ws := gorestful.ObjectRouter(r)
+
+ tags := []string{"凭证管理"}
+
+ ws.Route(ws.GET("").To(r.QuerySecret).Doc("凭证列表").
+ Param(ws.QueryParameter("page_size", "分页大小").DataType("intger")).
+ Param(ws.QueryParameter("page_number", "页码").DataType("intger")).
+ Param(ws.QueryParameter("keywords", "关键字过滤").DataType("string")).
+ Metadata(restfulspec.KeyOpenAPITags, tags).
+ Writes(SecretSet{}).
+ Returns(200, "OK", SecretSet{}).
+ Returns(404, "Not Found", exception.NewNotFound("")))
+
+ // :id -> {id}
+ ws.Route(ws.GET("/{id}").To(r.DescribeSecret).Doc("凭证详情").
+ Param(ws.PathParameter("id", "凭证Id").DataType("string")).
+ Metadata(restfulspec.KeyOpenAPITags, tags).
+ Writes(secret.Secret{}).
+ Returns(200, "OK", secret.Secret{}).
+ Returns(404, "Not Found", exception.NewNotFound("")))
+ return nil
+}
+
+type SecretSet struct {
+ Total int64 `json:"total"`
+ Items []*secret.Secret `json:"items"`
+}
+
+func (r *SecretApiHandler) QuerySecret(req *restful.Request, resp *restful.Response) {
+ sr := secret.NewQuerySecretRequest()
+
+ // 获取参数, bind
+ err := binding.Query.Bind(req.Request, sr)
+ if err != nil {
+ response.Failed(resp, exception.NewBadRequest(err.Error()))
+ return
+ }
+
+ // 业务逻辑
+ set, err := secret.GetService().QuerySecret(req.Request.Context(), sr)
+ if err != nil {
+ response.Failed(resp, err)
+ return
+ }
+
+ response.Success(resp, set)
+}
+
+func (r *SecretApiHandler) DescribeSecret(req *restful.Request, resp *restful.Response) {
+ sr := secret.NewDescribeSecretRequeset(req.PathParameter("id"))
+
+ // 业务逻辑
+ ins, err := secret.GetService().DescribeSecret(req.Request.Context(), sr)
+ if err != nil {
+ response.Failed(resp, err)
+ return
+ }
+
+ response.Success(resp, ins)
+}
diff --git a/devcloud-mini/cmdb/apps/secret/impl/impl_test.go b/devcloud-mini/cmdb/apps/secret/impl/impl_test.go
new file mode 100644
index 0000000..54ffb14
--- /dev/null
+++ b/devcloud-mini/cmdb/apps/secret/impl/impl_test.go
@@ -0,0 +1,17 @@
+package impl_test
+
+import (
+ "context"
+
+ "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/secret"
+ "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/test"
+)
+
+var (
+ ctx = context.Background()
+ svc = secret.GetService()
+)
+
+func init() {
+ test.SetUp()
+}
diff --git a/devcloud-mini/cmdb/apps/secret/impl/secret_test.go b/devcloud-mini/cmdb/apps/secret/impl/secret_test.go
new file mode 100644
index 0000000..54495df
--- /dev/null
+++ b/devcloud-mini/cmdb/apps/secret/impl/secret_test.go
@@ -0,0 +1,40 @@
+package impl_test
+
+import (
+ "testing"
+
+ "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/resource"
+ "gitlab.com/go-course-project/go17/devcloud-mini/cmdb/apps/secret"
+)
+
+func TestCreateSecret(t *testing.T) {
+ req := secret.NewCreateSecretRequest()
+ req.Name = "腾讯云只读账号"
+ req.Vendor = resource.VENDOR_TENCENT
+ req.ApiKey = "xxx"
+ req.ApiSecret = "xx"
+ req.Regions = []string{"ap-shanghai", "ap-guangzhou"}
+ ins, err := svc.CreateSecret(ctx, req)
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(ins)
+}
+
+func TestQuerySecret(t *testing.T) {
+ req := secret.NewQuerySecretRequest()
+ set, err := svc.QuerySecret(ctx, req)
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(set)
+}
+
+func TestDescribeSecret(t *testing.T) {
+ req := secret.NewDescribeSecretRequeset("0f6836e0-a894-3f87-b031-216478a8093b")
+ set, err := svc.DescribeSecret(ctx, req)
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(set)
+}
diff --git a/devcloud-mini/cmdb/apps/secret/model.go b/devcloud-mini/cmdb/apps/secret/model.go
index e47a20a..d3bbb3a 100644
--- a/devcloud-mini/cmdb/apps/secret/model.go
+++ b/devcloud-mini/cmdb/apps/secret/model.go
@@ -23,14 +23,14 @@ func NewSecret(in *CreateSecretRequest) *Secret {
return &Secret{
Id: uid,
UpdateAt: time.Now().Unix(),
- CreateSecretRequest: in,
+ CreateSecretRequest: *in,
}
}
type Secret struct {
- Id string `json:"id" bson:"_id"`
- UpdateAt int64 `json:"update_at" bson:"update_at"`
- *CreateSecretRequest `bson:"inline"`
+ Id string `json:"id" bson:"_id"`
+ UpdateAt int64 `json:"update_at" bson:"update_at"`
+ CreateSecretRequest `bson:"inline"`
}
func (s *Secret) String() string {
@@ -50,10 +50,11 @@ type CreateSecretRequest struct {
Vendor resource.VENDOR `json:"vendor"`
// Vmware
Address string `json:"address"`
- //
+ // 需要被脱敏
+ // Musk
ApiKey string `json:"api_key"`
//
- ApiSecret string `json:"api_secret"`
+ ApiSecret string `json:"api_secret" mask:",5,4"`
//
isEncrypted bool
@@ -73,7 +74,12 @@ func (r *CreateSecretRequest) EncryptedApiSecret() error {
// 对称加密 AES(cbc)
// @v1,xxxx@xxxxx
- cipherText, err := cbc.MustNewAESCBCCihper([]byte(SECRET_KEY)).Encrypt([]byte(r.ApiSecret))
+ key, err := base64.StdEncoding.DecodeString(SECRET_KEY)
+ if err != nil {
+ return err
+ }
+
+ cipherText, err := cbc.MustNewAESCBCCihper(key).Encrypt([]byte(r.ApiSecret))
if err != nil {
return err
}
@@ -90,7 +96,12 @@ func (r *CreateSecretRequest) DecryptedApiSecret() error {
return err
}
- plainText, err := cbc.MustNewAESCBCCihper([]byte(SECRET_KEY)).Decrypt([]byte(cipherdText))
+ key, err := base64.StdEncoding.DecodeString(SECRET_KEY)
+ if err != nil {
+ return err
+ }
+
+ plainText, err := cbc.MustNewAESCBCCihper(key).Decrypt([]byte(cipherdText))
if err != nil {
return err
}
diff --git a/devcloud-mini/cmdb/docs/design.drawio b/devcloud-mini/cmdb/docs/design.drawio
index f28718d..beed5aa 100644
--- a/devcloud-mini/cmdb/docs/design.drawio
+++ b/devcloud-mini/cmdb/docs/design.drawio
@@ -32,25 +32,34 @@
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/go.mod b/go.mod
index 5c9acec..b0ec726 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@ require (
github.com/gin-gonic/gin v1.10.0
github.com/go-playground/validator/v10 v10.20.0
github.com/google/uuid v1.6.0
- github.com/infraboard/mcube/v2 v2.0.49
+ github.com/infraboard/mcube/v2 v2.0.51
github.com/rs/zerolog v1.32.0
go.mongodb.org/mongo-driver v1.14.0
golang.org/x/crypto v0.31.0
diff --git a/go.sum b/go.sum
index b6d145d..68507ca 100644
--- a/go.sum
+++ b/go.sum
@@ -98,8 +98,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/infraboard/mcube/v2 v2.0.49 h1:V8Q8j5vOiYSnQmcVBeVGPlyJxNVsyniJgoKCGvGwy8c=
-github.com/infraboard/mcube/v2 v2.0.49/go.mod h1:gnr0xPPDPHvCS6JAzvdjqJ62J2+vUZTkobomjTXKsx0=
+github.com/infraboard/mcube/v2 v2.0.51 h1:QWgC6yo6qfx5xvU25MPdoQhkPuzjwrn8YfrQxOonL/8=
+github.com/infraboard/mcube/v2 v2.0.51/go.mod h1:gnr0xPPDPHvCS6JAzvdjqJ62J2+vUZTkobomjTXKsx0=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=