package morph import ( "errors" "fmt" "regexp" commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/encoding/address" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/spf13/cobra" "github.com/spf13/viper" ) var ( frostfsidSubjectNameRegexp = regexp.MustCompile(`^[\w+=,.@-]{1,64}$`) frostfsidGroupNameRegexp = regexp.MustCompile(`^[\w+=,.@-]{1,128}$`) // frostfsidNamespaceNameRegexp similar to https://git.frostfs.info/TrueCloudLab/frostfs-contract/src/commit/f2a82aa635aa57d9b05092d8cf15b170b53cc324/nns/nns_contract.go#L690 frostfsidNamespaceNameRegexp = regexp.MustCompile(`(^$)|(^[a-z0-9]{1,2}$)|(^[a-z0-9][a-z0-9-]{1,48}[a-z0-9]$)`) ) func getFrostfsIDAdmin(v *viper.Viper) (util.Uint160, bool, error) { admin := v.GetString(frostfsIDAdminConfigKey) if admin == "" { return util.Uint160{}, false, nil } h, err := address.StringToUint160(admin) if err == nil { return h, true, nil } h, err = util.Uint160DecodeStringLE(admin) if err == nil { return h, true, nil } pk, err := keys.NewPublicKeyFromString(admin) if err == nil { return pk.GetScriptHash(), true, nil } return util.Uint160{}, true, fmt.Errorf("frostfsid: admin is invalid: '%s'", admin) } func getFrostfsIDSubjectKey(cmd *cobra.Command) *keys.PublicKey { subjKeyHex, _ := cmd.Flags().GetString(subjectKeyFlag) subjKey, err := keys.NewPublicKeyFromString(subjKeyHex) commonCmd.ExitOnErr(cmd, "invalid subject key: %w", err) return subjKey } func getFrostfsIDSubjectAddress(cmd *cobra.Command) util.Uint160 { subjAddress, _ := cmd.Flags().GetString(subjectAddressFlag) subjAddr, err := address.StringToUint160(subjAddress) commonCmd.ExitOnErr(cmd, "invalid subject address: %w", err) return subjAddr } func getFrostfsIDSubjectName(cmd *cobra.Command) string { subjectName, _ := cmd.Flags().GetString(subjectNameFlag) if subjectName == "" { return "" } if !frostfsidSubjectNameRegexp.MatchString(subjectName) { commonCmd.ExitOnErr(cmd, "invalid subject name: %w", fmt.Errorf("name must match regexp: %s", frostfsidSubjectNameRegexp.String())) } return subjectName } func getFrostfsIDGroupName(cmd *cobra.Command) string { groupName, _ := cmd.Flags().GetString(groupNameFlag) if !frostfsidGroupNameRegexp.MatchString(groupName) { commonCmd.ExitOnErr(cmd, "invalid group name: %w", fmt.Errorf("name must match regexp: %s", frostfsidGroupNameRegexp.String())) } return groupName } func getFrostfsIDGroupID(cmd *cobra.Command) int64 { groupID, _ := cmd.Flags().GetInt64(groupIDFlag) if groupID <= 0 { commonCmd.ExitOnErr(cmd, "invalid group id: %w", errors.New("group id must be positive integer")) } return groupID } func getFrostfsIDNamespace(cmd *cobra.Command) string { ns, _ := cmd.Flags().GetString(namespaceFlag) if ns == rootNamespacePlaceholder { ns = "" } if !frostfsidNamespaceNameRegexp.MatchString(ns) { commonCmd.ExitOnErr(cmd, "invalid namespace: %w", fmt.Errorf("name must match regexp: %s", frostfsidNamespaceNameRegexp.String())) } return ns }