/
msp.go
86 lines (76 loc) · 1.88 KB
/
msp.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
package types
import (
"errors"
"github.com/golang/protobuf/proto"
msppb "github.com/hyperledger/fabric-protos-go/msp"
)
// XXX we need better alias name
type MSPPBConfig = msppb.MSPConfig
func NewMSPInfo(mspID string, config, policy []byte) MSPInfo {
return MSPInfo{
MSPID: mspID,
Config: config,
Policy: policy,
}
}
func (mi MSPInfos) GetMSPPBConfigs() ([]MSPPBConfig, error) {
configs := []MSPPBConfig{}
for _, mi := range mi.Infos {
// freezed MSPInfo is skipped
if mi.Freezed {
continue
}
if mi.Config == nil {
// valid MSPInfo should have a config
return nil, errors.New("a MSPInfo has no config")
}
var mspConfig MSPPBConfig
if err := proto.Unmarshal(mi.Config, &mspConfig); err != nil {
return nil, err
}
configs = append(configs, mspConfig)
}
return configs, nil
}
// return true whether the target MSPInfo is freezed or not
func (mi MSPInfos) HasMSPID(mspID string) bool {
idx := indexOfMSPID(mi, mspID)
return idx != -1
}
func (mi MSPInfos) IndexOf(mspID string) int {
idx := indexOfMSPID(mi, mspID)
return idx
}
func (mi MSPInfos) FindMSPInfo(mspID string) (*MSPInfo, error) {
idx := indexOfMSPID(mi, mspID)
if idx < 0 {
return nil, errors.New("MSPInfo not found")
}
return &mi.Infos[idx], nil
}
// assume header.ValidateBasic() == nil
func generateMSPInfos(header Header) (*MSPInfos, error) {
var infos MSPInfos
for _, mh := range header.MSPHeaders.Headers {
if mh.Type != MSPHeaderTypeCreate {
// TODO we should return an error if got an unexpected header?
continue
}
infos.Infos = append(infos.Infos, MSPInfo{
MSPID: mh.MSPID,
Config: mh.Config,
Policy: mh.Policy,
Freezed: false,
})
}
return &infos, nil
}
// return the index of the mspID or -1 if mspID is not present.
func indexOfMSPID(mi MSPInfos, mspID string) int {
for i, info := range mi.Infos {
if info.MSPID == mspID {
return i
}
}
return -1
}