Newer
Older
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
package rbac
import (
"encoding/json"
"io/ioutil"
"sync"
"code.fbi.h-da.de/danet/gosdn/controller/interfaces/rbac"
"code.fbi.h-da.de/danet/gosdn/controller/nucleus/errors"
"code.fbi.h-da.de/danet/gosdn/controller/store"
)
// FileSystemUserStore is the filesystem implementation of the user store
type FileSystemUserStore struct {
fileMutex sync.Mutex
pathToUserFile string
}
// NewFileSystemUserStore returns a filesystem implementation for a user store.
func NewFileSystemUserStore() rbac.UserStore {
store.EnsureFilesystemStorePathExists(store.UserFilename)
return &FileSystemUserStore{
fileMutex: sync.Mutex{},
pathToUserFile: store.GetCompletePathToFileStore(store.UserFilename),
}
}
func (s *FileSystemUserStore) readAllUsersFromFile() ([]rbac.LoadedUser, error) {
var loadedUsers []rbac.LoadedUser
content, err := ioutil.ReadFile(s.pathToUserFile)
if err != nil {
return nil, err
}
err = json.Unmarshal(content, &loadedUsers)
if err != nil {
return nil, err
}
return loadedUsers, nil
}
func (s *FileSystemUserStore) writeAllUsersToFile(users []rbac.LoadedUser) error {
serializedData, err := json.Marshal(users)
if err != nil {
return err
}
err = ioutil.WriteFile(s.pathToUserFile, serializedData, 0600)
if err != nil {
return err
}
return nil
}
// Add adds a User to the User store
func (s *FileSystemUserStore) Add(UserToAdd rbac.User) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
users, err := s.readAllUsersFromFile()
if err != nil {
return err
}
var loadedUser rbac.LoadedUser
loadedUser, err = store.TransformObjectToLoadedObject[rbac.User, rbac.LoadedUser](UserToAdd)
if err != nil {
return err
}
users = append(users, loadedUser)
err = s.writeAllUsersToFile(users)
if err != nil {
return err
}
return nil
}
//Delete deletes a User from the User store
func (s *FileSystemUserStore) Delete(userToDelete rbac.User) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
users, err := s.readAllUsersFromFile()
if err != nil {
return err
}
for i, user := range users {
if user.ID == userToDelete.ID().String() {
//remove item from slice
users[i] = users[len(users)-1]
users = users[:len(users)-1]
err = s.writeAllUsersToFile(users)
if err != nil {
return err
}
return nil
}
}
return &errors.ErrCouldNotDelete{Identifier: userToDelete.ID(), Type: userToDelete, Err: err}
}
//Get takes a Users ID and return the User if found
func (s *FileSystemUserStore) Get(query store.Query) (rbac.LoadedUser, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
var user rbac.LoadedUser
users, err := s.readAllUsersFromFile()
if err != nil {
return user, err
}
for _, user := range users {
if user.ID == query.ID.String() || user.UserName == query.Name {
return user, nil
}
}
Fabian Seidl
committed
return user, &errors.ErrCouldNotFind{ID: query.ID, Name: query.Name}
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
}
// GetAll returns all the Users
func (s *FileSystemUserStore) GetAll() ([]rbac.LoadedUser, error) {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
Users, err := s.readAllUsersFromFile()
return Users, err
}
//Update updates an exsisting user
func (s *FileSystemUserStore) Update(userToUpdate rbac.User) error {
s.fileMutex.Lock()
defer s.fileMutex.Unlock()
loadedUser, err := store.TransformObjectToLoadedObject[rbac.User, rbac.LoadedUser](userToUpdate)
if err != nil {
return err
}
users, err := s.readAllUsersFromFile()
if err != nil {
return err
}
for i, user := range users {
if user.ID == userToUpdate.ID().String() {
users[i] = loadedUser
err = s.writeAllUsersToFile(users)
if err != nil {
return err
}
return nil
}
}
return &errors.ErrCouldNotUpdate{Identifier: userToUpdate.ID(), Type: userToUpdate, Err: err}