增加简单的安全设置

This commit is contained in:
刘祥超
2020-11-20 18:06:54 +08:00
parent 71feb97c09
commit 8d8460c3fe
9 changed files with 197 additions and 8 deletions

View File

@@ -0,0 +1,98 @@
package securitymanager
import (
"encoding/json"
"github.com/TeaOSLab/EdgeAdmin/internal/rpc"
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/iwind/TeaGo/logs"
"reflect"
"sync"
)
var locker sync.Mutex
const (
SecuritySettingName = "adminSecurityConfig"
FrameNone = ""
FrameDeny = "DENY"
FrameSameOrigin = "SAMEORIGIN"
)
var sharedSecurityConfig *SecurityConfig = nil
type SecurityConfig struct {
Frame string `json:"frame"`
}
func LoadSecurityConfig() (*SecurityConfig, error) {
locker.Lock()
defer locker.Unlock()
config, err := loadSecurityConfig()
if err != nil {
return nil, err
}
v := reflect.Indirect(reflect.ValueOf(config)).Interface().(SecurityConfig)
return &v, nil
}
func UpdateSecurityConfig(securityConfig *SecurityConfig) error {
locker.Lock()
defer locker.Unlock()
var rpcClient, err = rpc.SharedRPC()
if err != nil {
return err
}
valueJSON, err := json.Marshal(securityConfig)
if err != nil {
return err
}
_, err = rpcClient.SysSettingRPC().UpdateSysSetting(rpcClient.Context(1), &pb.UpdateSysSettingRequest{
Code: SecuritySettingName,
ValueJSON: valueJSON,
})
if err != nil {
return err
}
sharedSecurityConfig = securityConfig
return nil
}
func loadSecurityConfig() (*SecurityConfig, error) {
if sharedSecurityConfig != nil {
return sharedSecurityConfig, nil
}
var rpcClient, err = rpc.SharedRPC()
if err != nil {
return nil, err
}
resp, err := rpcClient.SysSettingRPC().ReadSysSetting(rpcClient.Context(1), &pb.ReadSysSettingRequest{
Code: SecuritySettingName,
})
if err != nil {
return nil, err
}
if len(resp.ValueJSON) == 0 {
sharedSecurityConfig = defaultSecurityConfig()
return sharedSecurityConfig, nil
}
config := &SecurityConfig{}
err = json.Unmarshal(resp.ValueJSON, config)
if err != nil {
logs.Println("[SECURITY_MANAGER]" + err.Error())
sharedSecurityConfig = defaultSecurityConfig()
return sharedSecurityConfig, nil
}
sharedSecurityConfig = config
return sharedSecurityConfig, nil
}
func defaultSecurityConfig() *SecurityConfig {
return &SecurityConfig{
Frame: FrameSameOrigin,
}
}

View File

@@ -0,0 +1,32 @@
package securitymanager
import (
_ "github.com/iwind/TeaGo/bootstrap"
"testing"
"time"
)
func TestLoadSecurityConfig(t *testing.T) {
for i := 0; i < 10; i++ {
before := time.Now()
config, err := LoadSecurityConfig()
if err != nil {
t.Fatal(err)
}
t.Log(time.Since(before).Seconds()*1000, "ms")
t.Logf("%p", config)
}
}
func TestLoadSecurityConfig2(t *testing.T) {
for i := 0; i < 10; i++ {
config, err := LoadSecurityConfig()
if err != nil {
t.Fatal(err)
}
if i == 0 {
config.Frame = "DENY"
}
t.Log(config.Frame)
}
}