2023-11-08 13:36:55 +00:00
package morph
import (
2024-01-17 08:35:09 +00:00
"errors"
2023-11-08 13:36:55 +00:00
"fmt"
2024-01-17 08:35:09 +00:00
"regexp"
2023-11-08 13:36:55 +00:00
2024-01-12 10:54:00 +00:00
commonCmd "git.frostfs.info/TrueCloudLab/frostfs-node/cmd/internal/common"
2023-11-08 13:36:55 +00:00
"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"
2024-01-12 10:54:00 +00:00
"github.com/spf13/cobra"
2023-11-08 13:36:55 +00:00
"github.com/spf13/viper"
)
2024-01-17 08:35:09 +00:00
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]$) ` )
)
2023-12-04 13:12:59 +00:00
func getFrostfsIDAdmin ( v * viper . Viper ) ( util . Uint160 , bool , error ) {
admin := v . GetString ( frostfsIDAdminConfigKey )
if admin == "" {
return util . Uint160 { } , false , nil
}
2023-11-08 13:36:55 +00:00
2023-12-04 13:12:59 +00:00
h , err := address . StringToUint160 ( admin )
if err == nil {
return h , true , nil
}
2023-11-08 13:36:55 +00:00
2023-12-04 13:12:59 +00:00
h , err = util . Uint160DecodeStringLE ( admin )
if err == nil {
return h , true , nil
}
2023-11-08 13:36:55 +00:00
2023-12-04 13:12:59 +00:00
pk , err := keys . NewPublicKeyFromString ( admin )
if err == nil {
return pk . GetScriptHash ( ) , true , nil
2023-11-08 13:36:55 +00:00
}
2023-12-04 13:12:59 +00:00
return util . Uint160 { } , true , fmt . Errorf ( "frostfsid: admin is invalid: '%s'" , admin )
2023-11-08 13:36:55 +00:00
}
2024-01-12 10:54:00 +00:00
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
}
2024-01-12 15:03:18 +00:00
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
}
2024-01-17 08:35:09 +00:00
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
}