...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package core
16
17 import (
18 "errors"
19 "fmt"
20 "os"
21
22 "github.com/google/certificate-transparency-go/trillian/migrillian/configpb"
23 "google.golang.org/protobuf/encoding/prototext"
24 "google.golang.org/protobuf/proto"
25 )
26
27
28
29 func LoadConfigFromFile(filename string) (*configpb.MigrillianConfig, error) {
30 cfgBytes, err := os.ReadFile(filename)
31 if err != nil {
32 return nil, err
33 }
34 var cfg configpb.MigrillianConfig
35 if txtErr := prototext.Unmarshal(cfgBytes, &cfg); txtErr != nil {
36 if binErr := proto.Unmarshal(cfgBytes, &cfg); binErr != nil {
37 return nil, fmt.Errorf("failed to parse MigrillianConfig from %q as text protobuf (%v) or binary protobuf (%v)", filename, txtErr, binErr)
38 }
39 }
40
41 return &cfg, nil
42 }
43
44
45 func ValidateMigrationConfig(cfg *configpb.MigrationConfig) error {
46
47 switch {
48 case len(cfg.SourceUri) == 0:
49 return errors.New("missing CT log URI")
50 case cfg.PublicKey == nil:
51 return errors.New("missing public key")
52 case cfg.LogId <= 0:
53 return errors.New("log ID must be positive")
54 case cfg.BatchSize <= 0:
55 return errors.New("batch size must be positive")
56 }
57 switch idFunc := cfg.IdentityFunction; idFunc {
58 case configpb.IdentityFunction_SHA256_CERT_DATA:
59 case configpb.IdentityFunction_SHA256_LEAF_INDEX:
60 default:
61 return fmt.Errorf("unknown identity function: %v", idFunc)
62 }
63 return nil
64 }
65
66
67
68
69 func ValidateConfig(cfg *configpb.MigrillianConfig) error {
70
71 logIDs := make(map[int64]bool)
72 for _, mc := range cfg.MigrationConfigs.Config {
73 if err := ValidateMigrationConfig(mc); err != nil {
74 return fmt.Errorf("MigrationConfig: %v: %v", err, mc)
75 }
76 if ok := logIDs[mc.LogId]; ok {
77 return fmt.Errorf("duplicate tree ID %d: %v", mc.LogId, mc)
78 }
79 logIDs[mc.LogId] = true
80 }
81 return nil
82 }
83
View as plain text