forked from romshark/dgraph_graphql_go
/
serverConfig.go
119 lines (103 loc) · 2.84 KB
/
serverConfig.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
package config
import (
"errors"
"log"
"os"
"github.com/romshark/dgraph_graphql_go/api/passhash"
"github.com/romshark/dgraph_graphql_go/api/sesskeygen"
"github.com/romshark/dgraph_graphql_go/api/transport"
thttp "github.com/romshark/dgraph_graphql_go/api/transport/http"
)
// ServerConfig defines the API server configurations
type ServerConfig struct {
Mode Mode
DBHost string
Shield ShieldConfig
SessionKeyGenerator sesskeygen.SessionKeyGenerator
PasswordHasher passhash.PasswordHasher
DebugUser DebugUserConfig
Transport []transport.Server
DebugLog *log.Logger
ErrorLog *log.Logger
}
// Prepare sets defaults and validates the configurations
func (conf *ServerConfig) Prepare() error {
// Use production mode by default
if conf.Mode == "" {
conf.Mode = ModeProduction
}
// Set default database host address
if conf.DBHost == "" {
switch conf.Mode {
case ModeProduction:
conf.DBHost = "localhost:9080"
default:
conf.DBHost = "localhost:10180"
}
}
// Use default session key generator
if conf.SessionKeyGenerator == nil {
conf.SessionKeyGenerator = sesskeygen.NewDefault()
}
// Use default password hasher
if conf.PasswordHasher == nil {
conf.PasswordHasher = passhash.Bcrypt{}
}
// Use default debug logger to stdout
if conf.DebugLog == nil {
conf.DebugLog = log.New(
os.Stdout,
"DBG: ",
log.Ldate|log.Ltime,
)
}
// Use default error logger to stderr
if conf.ErrorLog == nil {
conf.ErrorLog = log.New(
os.Stderr,
"ERR: ",
log.Ldate|log.Ltime,
)
}
// VALIDATE
// Ensure at least one transport adapter is specified
if len(conf.Transport) < 1 {
return errors.New("no transport adapter")
}
if conf.Mode == ModeProduction {
// Validate transport adapters
for _, trn := range conf.Transport {
if httpAdapter, ok := trn.(*thttp.Server); ok {
// Ensure TLS is enabled in production on all transport adapters
conf := httpAdapter.Config()
if conf.TLS == nil {
return errors.New(
"TLS must not be disabled on HTTP transport adapter " +
"in production mode",
)
}
// Ensure playground is disabled in production
if conf.Playground {
return errors.New(
"the playground must be disabled on " +
"HTTP transport adapter in production mode",
)
}
}
}
// Ensure standard session key generator is used in production
if _, ok := conf.SessionKeyGenerator.(*sesskeygen.Default); !ok {
return errors.New(
"standard session key generator " +
"must be used in production mode",
)
}
// Ensure bcrypt password hasher is used in production
if _, ok := conf.PasswordHasher.(passhash.Bcrypt); !ok {
return errors.New(
"bcrypt password hasher must be used in production mode",
)
}
}
return conf.DebugUser.Prepares(conf.Mode)
}