forked from TykTechnologies/tyk-identity-broker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
data_loader.go
101 lines (85 loc) · 2.5 KB
/
data_loader.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
package main
import (
"encoding/json"
"github.com/lonelycode/tyk-auth-proxy/tap"
"io/ioutil"
"path"
"strconv"
"time"
)
// DataLoader is an interface that defines how data is loded from a source into a AuthRegisterBackend interface store
type DataLoader interface {
Init(conf interface{}) error
LoadIntoStore(tap.AuthRegisterBackend) error
Flush(tap.AuthRegisterBackend) error
}
// FileLoaderConf is the configuration struct for a FileLoader, takes a filename as main init
type FileLoaderConf struct {
FileName string
}
// FileLoader implements DataLoader and will load TAP Profiles from a file
type FileLoader struct {
config FileLoaderConf
}
// Init initialises the file loader
func (f *FileLoader) Init(conf interface{}) error {
f.config = conf.(FileLoaderConf)
return nil
}
// LoadIntoStore will load, unmarshal and copy profiles into a an AuthRegisterBackend
func (f *FileLoader) LoadIntoStore(store tap.AuthRegisterBackend) error {
thisSet, err := ioutil.ReadFile(f.config.FileName)
profiles := []tap.Profile{}
if err != nil {
log.Error("[FILE LOADER] Load failure: ", err)
return err
} else {
jsErr := json.Unmarshal(thisSet, &profiles)
if jsErr != nil {
log.Error("[FILE LOADER] Couldn't unmarshal profile set: ", jsErr)
return err
}
}
var loaded int
for _, profile := range profiles {
inputErr := AuthConfigStore.SetKey(profile.ID, profile)
if inputErr != nil {
log.Error("Couldn't encode configuration: ", inputErr)
} else {
loaded += 1
}
}
log.Info("[FILE LOADER] Loaded: ", loaded, " profiles from ", f.config.FileName)
return nil
}
func (f *FileLoader) Flush(store tap.AuthRegisterBackend) error {
oldSet, err := ioutil.ReadFile(f.config.FileName)
if err != nil {
log.Error("[FILE LOADER] load failed! ", err)
return err
}
ts := strconv.Itoa(int(time.Now().Unix()))
bkFilename := "profiles_backup_" + ts + ".json"
bkLocation := path.Join(config.ProfileDir, bkFilename)
wErr := ioutil.WriteFile(bkLocation, oldSet, 0644)
if wErr != nil {
log.Error("[FILE LOADER] backup failed! ", wErr)
return wErr
}
newSet := store.GetAll()
asJson, encErr := json.Marshal(newSet)
if encErr != nil {
log.Error("[FILE LOADER] Encoding failed! ", encErr)
return encErr
}
savePath := path.Join(config.ProfileDir, f.config.FileName)
if ProfileFilename != nil {
savePath = path.Join(config.ProfileDir, *ProfileFilename)
}
w2Err := ioutil.WriteFile(savePath, asJson, 0644)
if wErr != nil {
log.Error("[FILE LOADER] flush failed! ", w2Err)
return w2Err
}
return nil
}