1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package pgp
18
19
20
21
22
23
24 import (
25 "errors"
26 "strings"
27
28 "github.com/sassoftware/relic/cmdline/shared"
29
30 "github.com/spf13/cobra"
31 "github.com/spf13/pflag"
32 )
33
34 var (
35 argDigest string
36 argOutput string
37 argPgpUser string
38 argPgpArmor bool
39 argPgpDetached bool
40 argPgpClearsign bool
41 argPgpTextMode bool
42 )
43
44 func AddCompatFlags(cmd *cobra.Command) {
45 flags := cmd.Flags()
46 flags.StringVarP(&argPgpUser, "local-user", "u", "", "Specify keyname or cfgfile:keyname")
47 flags.StringVarP(&argOutput, "output", "o", "", "Write output to file")
48 flags.BoolVarP(&argPgpArmor, "armor", "a", false, "Create ASCII armored output")
49 flags.BoolVarP(&argPgpTextMode, "textmode", "t", false, "Sign in CRLF canonical text form")
50 flags.BoolVarP(&argPgpDetached, "detach-sign", "b", false, "Create a detached signature")
51 flags.BoolVar(&argPgpClearsign, "clearsign", false, "Create a cleartext signature")
52 flags.StringVar(&argDigest, "digest-algo", "", "Digest algorithm")
53
54 flags.BoolP("sign", "s", false, "(ignored)")
55 flags.BoolP("verbose", "v", false, "(ignored)")
56 flags.Bool("no-armor", false, "(ignored)")
57 flags.Bool("no-verbose", false, "(ignored)")
58 flags.BoolP("quiet", "q", false, "(ignored)")
59 flags.Bool("no-secmem-warning", false, "(ignored)")
60 flags.String("status-fd", "", "(ignored)")
61 flags.String("logger-fd", "", "(ignored)")
62 flags.String("attribute-fd", "", "(ignored)")
63 }
64
65 func CallCmd(src, dest *cobra.Command, args []string) error {
66 if argPgpUser == "" {
67 return errors.New("-u must be set to a keyname or cfgpath:keyname")
68 }
69 setFlag(dest.Flags(), "sig-type", "pgp")
70 idx := strings.LastIndex(argPgpUser, ":")
71 if idx <= 0 {
72 setFlag(dest.Flags(), "key", argPgpUser)
73 } else {
74 setFlag(shared.RootCmd.PersistentFlags(), "config", argPgpUser[:idx])
75 setFlag(dest.Flags(), "key", argPgpUser[idx+1:])
76 }
77 if len(args) == 0 {
78 setFlag(dest.Flags(), "file", "-")
79 } else if len(args) == 1 {
80 setFlag(dest.Flags(), "file", args[0])
81 } else {
82 return errors.New("expected 0 or 1 argument")
83 }
84 if argOutput == "" {
85 argOutput = "-"
86 }
87 setFlag(dest.Flags(), "output", argOutput)
88 if argPgpArmor {
89 setFlag(dest.Flags(), "armor", "true")
90 }
91 if argPgpTextMode {
92 setFlag(dest.Flags(), "textmode", "true")
93 }
94 if argPgpClearsign {
95 setFlag(dest.Flags(), "clearsign", "true")
96 } else if !argPgpDetached {
97 setFlag(dest.Flags(), "inline", "true")
98 }
99 if argDigest != "" {
100 setFlag(dest.Flags(), "digest", argDigest)
101 }
102 return dest.RunE(dest, []string{})
103 }
104
105 func setFlag(flags *pflag.FlagSet, name, value string) {
106 if err := flags.Set(name, value); err != nil {
107 panic(err)
108 }
109 }
110
View as plain text