-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
config.go
170 lines (149 loc) · 4.59 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
package cmd
import (
"errors"
"fmt"
"os"
"strings"
log "github.com/sirupsen/logrus"
"github.com/digitorus/pdfsigner/signer"
"github.com/mitchellh/go-homedir"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
// servicesConfigArr stores configs for signers for multiple-services command
// Since Viper is not supporting access to array, we need to make structures and unmarshal config manually
var signersConfigArr []signerConfig
// serviceConfig is a config of the service
type signerConfig struct {
// Name is the name of the signer used to identify signer inside the config
Name string
// Type is the type of the signer. PEM, PKSC11.
Type string
// CrtPath is the path to the certificate file.
CrtPath string
// KeyPath is the path to the private key file
KeyPath string
// LibPath is the path to the PKSC11 library.
LibPath string
// Pass is the password for PSKC11.
Pass string
// CrtChainPath is the path to chain of the certificates
CrtChainPath string
// SignConfig contains data needed for signing
SignData signer.SignData
}
// servicesConfigArr stores configs for services for multiple-services command
var servicesConfigArr []serviceConfig
// serviceConfig is a config of the service
type serviceConfig struct {
// Name is the name of the service
Name string
// Type is the type of the service. Watch, Serve.
Type string
// ValidateSignature allows to verify signature after sign used as default for serve services
ValidateSignature bool
// Watch config.
// Signer is the signer name to be used by watch.
Signer string
// In is the input folder used by watch.
In string
// Out is the output folder used by watch.
Out string
// Serve config.
// Signers is the signers names to be used by serve.
Signers []string
// Addr is the address on which to serve
Addr string
// Port is the port on which to serve
Port string
}
// initConfig reads in config inputFile and ENV variables if set.
func initConfig(cmd *cobra.Command) {
preParseConfigFlag()
if configFilePathFlag != "" {
// Use config inputFile from the flag.
viper.SetConfigFile(configFilePathFlag)
} else {
// Find home directory.
home, err := homedir.Dir()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// Search config in home directory with name ".pdfsigner" (without extension).
viper.AddConfigPath(home)
viper.SetConfigName(".pdfsigner")
}
viper.AutomaticEnv() // read in environment variables that match
viper.SetEnvPrefix("PDF") // set env prefix
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
// If a config inputFile is found, read it in.
err := viper.ReadInConfig()
if err == nil {
log.Println("Using config file:", viper.ConfigFileUsed())
// validate config
if len(viper.AllSettings()) == 0 {
log.Fatal(errors.New("config is not properly formatted or empty"))
}
}
if err != nil && configFilePathFlag != "" {
log.Fatal(err)
}
// unmarshal signers
if err := unmarshalSigners(); err != nil {
log.Fatal(err)
}
// unmarshal services for mixed command
if err := unmarshalServices(); err != nil {
log.Fatal(err)
}
// assign licensePath config value to variable
licenseStrConfOrFlag = viper.GetString("license")
// setup CLI overrides for signers and services of the config if it's multi command
setupMultiSignersFlags(cmd)
setupMultiServiceFlags(cmd)
}
// preParseConfigFlag parses config flag before cobra initialized.
// needed to override signers and services config settings
func preParseConfigFlag() {
const configFlagName = "--config"
args := strings.Join(os.Args[1:], " ")
if strings.Contains(args, configFlagName) {
fields := strings.Fields(args)
for i, f := range fields {
if strings.Contains(f, configFlagName) && len(fields) > i+1 {
configFilePathFlag = fields[i+1]
}
}
}
}
// unmarshalSigners assigns signers from the config into the signersConfigArr variable
func unmarshalSigners() error {
for key := range viper.AllSettings() {
if strings.HasPrefix(key, "signer") {
var sc signerConfig
if err := viper.UnmarshalKey(key, &sc); err != nil {
return err
}
//sc.Name = strings.Replace(key, "signer", "", 1)
sc.Name = key
signersConfigArr = append(signersConfigArr, sc)
}
}
return nil
}
// unmarshalSigners assigns services from the config into the servicesConfigArr variable
func unmarshalServices() error {
for key := range viper.AllSettings() {
if strings.HasPrefix(key, "service") {
var sc serviceConfig
if err := viper.UnmarshalKey(key, &sc); err != nil {
return err
}
//sc.Name = strings.Replace(key, "service", "", 1)
sc.Name = key
servicesConfigArr = append(servicesConfigArr, sc)
}
}
return nil
}