@@ -706,9 +706,16 @@ func TestMcpProvider(p *Provider, lang string) (string, error) {
706706
707707// TestToolProvider parses provider.testContent as {"tool":"...","arguments":{}} and invokes one builtin tool.
708708func TestToolProvider (p * Provider , lang string ) (string , error ) {
709+ return p .testToolProviderWithLoader (lang , getProvider )
710+ }
711+
712+ func (p * Provider ) testToolProviderWithLoader (lang string , loadProvider func (owner string , name string ) (* Provider , error )) (string , error ) {
709713 if p .Category != "Tool" {
710714 return "" , fmt .Errorf (i18n .Translate (lang , "object:provider is not a Tool provider" ))
711715 }
716+ if err := p .restoreMaskedToolProviderSecrets (loadProvider ); err != nil {
717+ return "" , err
718+ }
712719
713720 var payload struct {
714721 Tool string `json:"tool"`
@@ -724,7 +731,7 @@ func TestToolProvider(p *Provider, lang string) (string, error) {
724731 payload .Arguments = map [string ]interface {}{}
725732 }
726733
727- tp , err := tool .NewProvider (p . Category , p . Type , lang )
734+ tp , err := tool .NewProvider (getToolProviderConfig ( p ) , lang )
728735 if err != nil {
729736 return "" , err
730737 }
@@ -760,6 +767,55 @@ func TestToolProvider(p *Provider, lang string) (string, error) {
760767 return output , nil
761768}
762769
770+ func getToolProviderConfig (p * Provider ) tool.ProviderConfig {
771+ return tool.ProviderConfig {
772+ Category : p .Category ,
773+ Type : p .Type ,
774+ SubType : p .SubType ,
775+ ProviderUrl : p .ProviderUrl ,
776+ ClientId : p .ClientId ,
777+ ClientSecret : p .ClientSecret ,
778+ }
779+ }
780+
781+ func (p * Provider ) restoreMaskedToolProviderSecrets (loadProvider func (owner string , name string ) (* Provider , error )) error {
782+ if p == nil {
783+ return nil
784+ }
785+
786+ maskedClientSecret := p .ClientSecret == "***"
787+ maskedUserKey := p .UserKey == "***"
788+ maskedSignKey := p .SignKey == "***"
789+ if ! maskedClientSecret && ! maskedUserKey && ! maskedSignKey {
790+ return nil
791+ }
792+ if strings .TrimSpace (p .Owner ) == "" || strings .TrimSpace (p .Name ) == "" {
793+ return fmt .Errorf ("cannot restore masked tool provider secrets without owner and name" )
794+ }
795+
796+ providerDb , err := loadProvider (p .Owner , p .Name )
797+ if err != nil {
798+ return err
799+ }
800+ if providerDb == nil {
801+ return fmt .Errorf ("provider not found: %s/%s" , p .Owner , p .Name )
802+ }
803+
804+ p .processProviderParams (providerDb )
805+
806+ if maskedClientSecret && (p .ClientSecret == "" || p .ClientSecret == "***" ) {
807+ return fmt .Errorf ("masked clientSecret could not be restored" )
808+ }
809+ if maskedUserKey && (p .UserKey == "" || p .UserKey == "***" ) {
810+ return fmt .Errorf ("masked userKey could not be restored" )
811+ }
812+ if maskedSignKey && (p .SignKey == "" || p .SignKey == "***" ) {
813+ return fmt .Errorf ("masked signKey could not be restored" )
814+ }
815+
816+ return nil
817+ }
818+
763819func (p * Provider ) processProviderParams (providerDb * Provider ) {
764820 if p .ClientSecret == "***" {
765821 p .ClientSecret = providerDb .ClientSecret
0 commit comments