@@ -35,6 +35,13 @@ import (
3535 "github.com/sassoftware/relic/v7/lib/pkcs9"
3636)
3737
38+ var common * pflag.FlagSet
39+
40+ func init () {
41+ common = pflag .NewFlagSet ("common" , pflag .ExitOnError )
42+ common .Bool ("no-timestamp" , false , "Do not attach a trusted timestamp even if the selected key configures one" )
43+ }
44+
3845type SignOpts struct {
3946 Path string
4047 Hash crypto.Hash
@@ -89,6 +96,22 @@ type FlagValues struct {
8996 Values map [string ]string
9097}
9198
99+ func (v * FlagValues ) mergeAll (defs * pflag.FlagSet , getter func (string ) string ) {
100+ if defs != nil {
101+ v .mergeSet (defs , getter )
102+ }
103+ v .mergeSet (common , getter )
104+ }
105+
106+ func (v * FlagValues ) mergeSet (defs * pflag.FlagSet , getter func (string ) string ) {
107+ defs .VisitAll (func (flag * pflag.Flag ) {
108+ value := getter (flag .Name )
109+ if value != "" {
110+ v .Values [flag .Name ] = value
111+ }
112+ })
113+ }
114+
92115// FlagsFromCmdline creates a FlagValues from the (merged) command-line options of a command
93116func (s * Signer ) FlagsFromCmdline (fs * pflag.FlagSet ) (* FlagValues , error ) {
94117 for flag , users := range flagMap {
@@ -106,43 +129,31 @@ func (s *Signer) FlagsFromCmdline(fs *pflag.FlagSet) (*FlagValues, error) {
106129 return nil , fmt .Errorf ("flag \" %s\" is not allowed for signature type \" %s\" " , flag , s .Name )
107130 }
108131 }
109- if s .flags == nil {
110- return nil , nil
111- }
112132 values := & FlagValues {
113133 Defs : s .flags ,
114134 Values : make (map [string ]string ),
115135 }
116- s .flags . VisitAll ( func (flag * pflag. Flag ) {
117- if fs .Changed (flag . Name ) {
118- values . Values [ flag . Name ] = fs . Lookup ( flag . Name ). Value . String ()
136+ values . mergeAll ( s .flags , func (name string ) string {
137+ if ! fs .Changed (name ) {
138+ return ""
119139 }
140+ return fs .Lookup (name ).Value .String ()
120141 })
121142 return values , nil
122143}
123144
124145// FlagsFromQuery creates a FlagValues from URL query parameters
125146func (s * Signer ) FlagsFromQuery (q url.Values ) (* FlagValues , error ) {
126- if s .flags == nil {
127- return nil , nil
128- }
129147 values := & FlagValues {
130148 Defs : s .flags ,
131149 Values : make (map [string ]string ),
132150 }
133- s .flags .VisitAll (func (flag * pflag.Flag ) {
134- if value := q .Get (flag .Name ); value != "" {
135- values .Values [flag .Name ] = value
136- }
137- })
151+ values .mergeAll (s .flags , q .Get )
138152 return values , nil
139153}
140154
141155// ToQuery appends query parameters to a URL for each option in the flag set
142156func (values * FlagValues ) ToQuery (q url.Values ) error {
143- if values == nil {
144- return nil
145- }
146157 for key , value := range values .Values {
147158 q .Set (key , value )
148159 }
@@ -151,10 +162,10 @@ func (values *FlagValues) ToQuery(q url.Values) error {
151162
152163// GetString returns the flag's value as a string
153164func (values * FlagValues ) GetString (name string ) string {
154- if values == nil {
155- panic ("flag " + name + " not defined for signer module" )
165+ flag := common .Lookup (name )
166+ if flag == nil && values .Defs != nil {
167+ flag = values .Defs .Lookup (name )
156168 }
157- flag := values .Defs .Lookup (name )
158169 if flag == nil {
159170 panic ("flag " + name + " not defined for signer module" )
160171 }
0 commit comments