mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			168 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
 | 
						|
 | 
						|
package access
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
						|
	"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
 | 
						|
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
						|
	"github.com/iwind/TeaGo/actions"
 | 
						|
	"github.com/iwind/TeaGo/maps"
 | 
						|
)
 | 
						|
 | 
						|
type UpdatePopupAction struct {
 | 
						|
	actionutils.ParentAction
 | 
						|
}
 | 
						|
 | 
						|
func (this *UpdatePopupAction) Init() {
 | 
						|
	this.Nav("", "", "")
 | 
						|
}
 | 
						|
 | 
						|
func (this *UpdatePopupAction) RunGet(params struct {
 | 
						|
	PolicyId int64
 | 
						|
}) {
 | 
						|
	this.Data["authTypes"] = serverconfigs.FindAllHTTPAuthTypes()
 | 
						|
 | 
						|
	policyResp, err := this.RPC().HTTPAuthPolicyRPC().FindEnabledHTTPAuthPolicy(this.AdminContext(), &pb.FindEnabledHTTPAuthPolicyRequest{HttpAuthPolicyId: params.PolicyId})
 | 
						|
	if err != nil {
 | 
						|
		this.ErrorPage(err)
 | 
						|
		return
 | 
						|
	}
 | 
						|
	policy := policyResp.HttpAuthPolicy
 | 
						|
	if policy == nil {
 | 
						|
		this.NotFound("httpAuthPolicy", params.PolicyId)
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	var authParams = map[string]interface{}{}
 | 
						|
	if len(policy.ParamsJSON) > 0 {
 | 
						|
		err = json.Unmarshal(policy.ParamsJSON, &authParams)
 | 
						|
		if err != nil {
 | 
						|
			this.ErrorPage(err)
 | 
						|
			return
 | 
						|
		}
 | 
						|
	}
 | 
						|
	this.Data["policy"] = maps.Map{
 | 
						|
		"id":     policy.Id,
 | 
						|
		"isOn":   policy.IsOn,
 | 
						|
		"name":   policy.Name,
 | 
						|
		"type":   policy.Type,
 | 
						|
		"params": authParams,
 | 
						|
	}
 | 
						|
 | 
						|
	this.Show()
 | 
						|
}
 | 
						|
 | 
						|
func (this *UpdatePopupAction) RunPost(params struct {
 | 
						|
	PolicyId int64
 | 
						|
 | 
						|
	Name string
 | 
						|
	IsOn bool
 | 
						|
 | 
						|
	// BasicAuth
 | 
						|
	HttpAuthBasicAuthUsersJSON []byte
 | 
						|
	BasicAuthRealm             string
 | 
						|
	BasicAuthCharset           string
 | 
						|
 | 
						|
	// SubRequest
 | 
						|
	SubRequestURL           string
 | 
						|
	SubRequestMethod        string
 | 
						|
	SubRequestFollowRequest bool
 | 
						|
 | 
						|
	Must *actions.Must
 | 
						|
	CSRF *actionutils.CSRF
 | 
						|
}) {
 | 
						|
	defer this.CreateLogInfo("修改HTTP认证 %d", params.PolicyId)
 | 
						|
 | 
						|
	policyResp, err := this.RPC().HTTPAuthPolicyRPC().FindEnabledHTTPAuthPolicy(this.AdminContext(), &pb.FindEnabledHTTPAuthPolicyRequest{HttpAuthPolicyId: params.PolicyId})
 | 
						|
	if err != nil {
 | 
						|
		this.ErrorPage(err)
 | 
						|
		return
 | 
						|
	}
 | 
						|
	policy := policyResp.HttpAuthPolicy
 | 
						|
	if policy == nil {
 | 
						|
		this.NotFound("httpAuthPolicy", params.PolicyId)
 | 
						|
		return
 | 
						|
	}
 | 
						|
	policyType := policy.Type
 | 
						|
 | 
						|
	params.Must.
 | 
						|
		Field("name", params.Name).
 | 
						|
		Require("请输入名称")
 | 
						|
 | 
						|
	var ref = &serverconfigs.HTTPAuthPolicyRef{IsOn: true}
 | 
						|
	var paramsJSON []byte
 | 
						|
 | 
						|
	switch policyType {
 | 
						|
	case serverconfigs.HTTPAuthTypeBasicAuth:
 | 
						|
		users := []*serverconfigs.HTTPAuthBasicMethodUser{}
 | 
						|
		err := json.Unmarshal(params.HttpAuthBasicAuthUsersJSON, &users)
 | 
						|
		if err != nil {
 | 
						|
			this.ErrorPage(err)
 | 
						|
			return
 | 
						|
		}
 | 
						|
		if len(users) == 0 {
 | 
						|
			this.Fail("请添加至少一个用户")
 | 
						|
		}
 | 
						|
		method := &serverconfigs.HTTPAuthBasicMethod{
 | 
						|
			Users:   users,
 | 
						|
			Realm:   params.BasicAuthRealm,
 | 
						|
			Charset: params.BasicAuthCharset,
 | 
						|
		}
 | 
						|
		methodJSON, err := json.Marshal(method)
 | 
						|
		if err != nil {
 | 
						|
			this.ErrorPage(err)
 | 
						|
			return
 | 
						|
		}
 | 
						|
 | 
						|
		paramsJSON = methodJSON
 | 
						|
	case serverconfigs.HTTPAuthTypeSubRequest:
 | 
						|
		params.Must.Field("subRequestURL", params.SubRequestURL).
 | 
						|
			Require("请输入子请求URL")
 | 
						|
		if params.SubRequestFollowRequest {
 | 
						|
			params.SubRequestMethod = ""
 | 
						|
		}
 | 
						|
		method := &serverconfigs.HTTPAuthSubRequestMethod{
 | 
						|
			URL:    params.SubRequestURL,
 | 
						|
			Method: params.SubRequestMethod,
 | 
						|
		}
 | 
						|
		methodJSON, err := json.Marshal(method)
 | 
						|
		if err != nil {
 | 
						|
			this.ErrorPage(err)
 | 
						|
			return
 | 
						|
		}
 | 
						|
		paramsJSON = methodJSON
 | 
						|
	default:
 | 
						|
		this.Fail("不支持的认证类型'" + policyType + "'")
 | 
						|
	}
 | 
						|
 | 
						|
	var paramsMap map[string]interface{}
 | 
						|
	err = json.Unmarshal(paramsJSON, ¶msMap)
 | 
						|
	if err != nil {
 | 
						|
		this.ErrorPage(err)
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	_, err = this.RPC().HTTPAuthPolicyRPC().UpdateHTTPAuthPolicy(this.AdminContext(), &pb.UpdateHTTPAuthPolicyRequest{
 | 
						|
		HttpAuthPolicyId: params.PolicyId,
 | 
						|
		Name:             params.Name,
 | 
						|
		ParamsJSON:       paramsJSON,
 | 
						|
		IsOn:             params.IsOn,
 | 
						|
	})
 | 
						|
	if err != nil {
 | 
						|
		this.ErrorPage(err)
 | 
						|
		return
 | 
						|
	}
 | 
						|
	ref.AuthPolicy = &serverconfigs.HTTPAuthPolicy{
 | 
						|
		Id:     params.PolicyId,
 | 
						|
		Name:   params.Name,
 | 
						|
		IsOn:   params.IsOn,
 | 
						|
		Type:   policyType,
 | 
						|
		Params: paramsMap,
 | 
						|
	}
 | 
						|
 | 
						|
	this.Data["policyRef"] = ref
 | 
						|
	this.Success()
 | 
						|
}
 |