diff --git a/internal/output/chains.go b/internal/output/chains.go new file mode 100644 index 0000000..c76c71a --- /dev/null +++ b/internal/output/chains.go @@ -0,0 +1,56 @@ +package output + +import ( + "encoding/base64" + + apechain "git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain" + "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" + "github.com/spf13/cobra" +) + +const ( + minPrintable = 32 + maxPrintable = 127 +) + +func PrintChains(cmd *cobra.Command, list []stackitem.Item, decodeChain, decodeID bool) error { + for _, item := range list { + bytes, err := item.TryBytes() + if err != nil { + return err + } + + if !decodeChain { + cmd.Println(string(bytes)) + continue + } + + var chain apechain.Chain + if err = chain.DecodeBytes(bytes); err != nil { + cmd.PrintErrf("invalid chain format: %s\n", base64.StdEncoding.EncodeToString(bytes)) + continue + } + + raw, err := chain.MarshalJSON() + if err != nil { + return err + } + + if decodeID { + var printableID string + + for _, r := range string(chain.ID) { + if minPrintable <= r && r <= maxPrintable { + printableID += string(r) + } else { + printableID += "." + } + } + cmd.Println(printableID, string(raw)) + } else { + cmd.Println(string(raw)) + } + } + + return nil +} diff --git a/modules/chains/list_container.go b/modules/chains/list_container.go index 7f74ff5..748275a 100644 --- a/modules/chains/list_container.go +++ b/modules/chains/list_container.go @@ -5,6 +5,7 @@ import ( "git.frostfs.info/TrueCloudLab/frostfs-contract/commonclient" policycontract "git.frostfs.info/TrueCloudLab/frostfs-contract/policy" + "git.frostfs.info/dkirillov/policy-reader/internal/output" "git.frostfs.info/dkirillov/policy-reader/internal/resolver" "github.com/nspcc-dev/neo-go/pkg/rpcclient" "github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker" @@ -63,11 +64,12 @@ func runListContainerCmd(cmd *cobra.Command, _ []string) error { return err } + const decodeChain = true decodeID := viper.GetBool(decodeIDFlag) cmd.Println("cid:", cnrID) cmd.Printf("namespace '%s' policies: %d\n", ns, len(res)) - if err = printChains(cmd, res, decodeID); err != nil { + if err = output.PrintChains(cmd, res, decodeChain, decodeID); err != nil { return err } @@ -77,9 +79,5 @@ func runListContainerCmd(cmd *cobra.Command, _ []string) error { } cmd.Printf("container policies: %d\n", len(res)) - if err = printChains(cmd, res, decodeID); err != nil { - return err - } - - return nil + return output.PrintChains(cmd, res, decodeChain, decodeID) } diff --git a/modules/chains/list_user.go b/modules/chains/list_user.go index ba0f58a..d307df0 100644 --- a/modules/chains/list_user.go +++ b/modules/chains/list_user.go @@ -1,7 +1,6 @@ package chains import ( - "encoding/base64" "encoding/hex" "errors" "fmt" @@ -11,11 +10,11 @@ import ( ffsidclient "git.frostfs.info/TrueCloudLab/frostfs-contract/frostfsid/client" policycontract "git.frostfs.info/TrueCloudLab/frostfs-contract/policy" apechain "git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain" + "git.frostfs.info/dkirillov/policy-reader/internal/output" "git.frostfs.info/dkirillov/policy-reader/internal/resolver" neoflags "github.com/nspcc-dev/neo-go/cli/flags" "github.com/nspcc-dev/neo-go/pkg/rpcclient" "github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker" - "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" "github.com/nspcc-dev/neo-go/pkg/wallet" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -93,10 +92,11 @@ func runListCmd(cmd *cobra.Command, _ []string) error { return err } + const decodeChain = true decodeID := viper.GetBool(decodeIDFlag) cmd.Printf("user namespace '%s' policies: %d\n", subj.Namespace, len(res)) - if err = printChains(cmd, res, decodeID); err != nil { + if err = output.PrintChains(cmd, res, decodeID, decodeID); err != nil { return err } @@ -109,7 +109,7 @@ func runListCmd(cmd *cobra.Command, _ []string) error { } cmd.Printf("user policies: %d\n", len(res)) - if err = printChains(cmd, res, decodeID); err != nil { + if err = output.PrintChains(cmd, res, decodeChain, decodeID); err != nil { return err } @@ -125,7 +125,7 @@ func runListCmd(cmd *cobra.Command, _ []string) error { } cmd.Printf("user group '%s' (id: %d) policies: %d\n", group.Name, group.ID, len(res)) - if err = printChains(cmd, res, decodeID); err != nil { + if err = output.PrintChains(cmd, res, decodeChain, decodeID); err != nil { return err } } @@ -133,34 +133,6 @@ func runListCmd(cmd *cobra.Command, _ []string) error { return nil } -func printChains(cmd *cobra.Command, list []stackitem.Item, decodeID bool) error { - for _, item := range list { - bytes, err := item.TryBytes() - if err != nil { - return err - } - - var chain apechain.Chain - if err = chain.DecodeBytes(bytes); err != nil { - cmd.Printf("invalid chain format: %s\n", base64.StdEncoding.EncodeToString(bytes)) - continue - } - - raw, err := chain.MarshalJSON() - if err != nil { - return err - } - - if decodeID { - cmd.Println(string(chain.ID), string(raw)) - } else { - cmd.Println(string(raw)) - } - } - - return nil -} - func resolveSubject(ffsid *ffsidclient.Client, namespace, userName string) (*ffsidclient.SubjectExtended, error) { if userHash, err := neoflags.ParseAddress(userName); err == nil { subj, err := ffsid.GetSubject(userHash) diff --git a/modules/contract/list_chains_by_prefix.go b/modules/contract/list_chains_by_prefix.go index 4ab6cfc..aeff497 100644 --- a/modules/contract/list_chains_by_prefix.go +++ b/modules/contract/list_chains_by_prefix.go @@ -4,7 +4,7 @@ import ( "encoding/base64" "git.frostfs.info/TrueCloudLab/frostfs-contract/commonclient" - apechain "git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain" + "git.frostfs.info/dkirillov/policy-reader/internal/output" "git.frostfs.info/dkirillov/policy-reader/internal/resolver" "github.com/nspcc-dev/neo-go/pkg/rpcclient" "github.com/nspcc-dev/neo-go/pkg/rpcclient/invoker" @@ -90,36 +90,6 @@ func runListChainsByPrefixCmd(cmd *cobra.Command, _ []string) error { cmd.Printf("%s target chains names: %d\n", typ, len(res)) - decodeID := viper.GetBool(decodeIDFlag) - - for _, re := range res { - bytes, err := re.TryBytes() - if err != nil { - return err - } - - if typ == "iam" { - cmd.Println(string(bytes)) - continue - } - - var chain apechain.Chain - if err = chain.DecodeBytes(bytes); err != nil { - cmd.Printf("invalid chain format: %s\n", base64.StdEncoding.EncodeToString(bytes)) - continue - } - - raw, err := chain.MarshalJSON() - if err != nil { - return err - } - - if decodeID { - cmd.Println(string(chain.ID), string(raw)) - } else { - cmd.Println(string(raw)) - } - } - - return nil + decodeChain := typ != "iam" + return output.PrintChains(cmd, res, decodeChain, viper.GetBool(decodeIDFlag)) }