forked from Normation/rudder-plugins
-
Notifications
You must be signed in to change notification settings - Fork 0
/
UserManagement.elm
192 lines (172 loc) · 8.25 KB
/
UserManagement.elm
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
120
121
122
123
124
125
126
127
128
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
module UserManagement exposing (processApiError, update)
import ApiCalls exposing (addUser, getRoleConf, getUsersConf, postReloadConf, updateUser)
import Browser
import DataTypes exposing (Model, Msg(..), PanelMode(..), StateInput(..), userProviders)
import Dict exposing (fromList)
import Http exposing (..)
import Init exposing (createErrorNotification, createSuccessNotification, defaultConfig, init, subscriptions)
import String exposing (isEmpty)
import Toasty
import View exposing (view)
import List
import List.FlatMap
main =
Browser.element
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
CallApi call ->
(model, call model)
{--Api Calls message --}
GetUserInfo result ->
case result of
Ok u ->
let
recordUser =
List.map (\x -> (x.login, x)) u.users
users = fromList recordUser
newPanelMode =
case model.panelMode of
EditMode user ->
case Dict.get user.login users of
Just u_ ->
EditMode u_
Nothing ->
Closed
_ ->
Closed
newModel =
{ model | roleListOverride = u.roleListOverride, users = users, panelMode = newPanelMode, digest = u.digest, providers = (userProviders u.authenticationBackends), providersProperties = u.providersProperties}
in
( newModel, getRoleConf model )
Err err ->
processApiError err model
GetRoleConf result ->
case result of
Ok roles ->
let
recordRole =
List.map (\x -> (x.id, x.rights)) roles
newModel =
{ model | rolesConf = roles , roles = fromList recordRole}
in
( newModel, Cmd.none )
Err err ->
processApiError err model
PostReloadUserInfo result ->
case result of
Ok _ ->
(model, getUsersConf model)
Err err ->
processApiError err model
SendReload ->
(model, postReloadConf model)
|> createSuccessNotification "User configuration's file have been reloaded"
ToastyMsg subMsg ->
Toasty.update defaultConfig ToastyMsg subMsg model
ActivePanelAddUser ->
if model.panelMode == AddMode then
({model | panelMode = Closed, rolesToAddOnSave = [], userForcePasswdInput = False}, Cmd.none)
else
({model | panelMode = AddMode, rolesToAddOnSave = [], userForcePasswdInput = False}, Cmd.none)
ActivePanelSettings user ->
case model.panelMode of
EditMode u ->
if u.login == user.login then
({model | panelMode = Closed, rolesToAddOnSave = [], userForcePasswdInput = False}, Cmd.none)
else
({model |rolesToAddOnSave = [], password = "", panelMode = EditMode user, userForcePasswdInput = False }, Cmd.none)
_ ->
({model | panelMode = EditMode user}, Cmd.none)
DeactivatePanel ->
({model | isValidInput = ValidInputs, panelMode = Closed, rolesToAddOnSave = [], password = "", userForcePasswdInput = False}, Cmd.none)
AddUser result ->
case result of
Ok username ->
(model, getUsersConf model )
|> createSuccessNotification (username ++ " have been added")
Err err ->
processApiError err model
DeleteUser result ->
case result of
Ok deletedUser ->
({model | panelMode = Closed, login = "", openDeleteModal = False}, getUsersConf model)
|> createSuccessNotification (deletedUser ++ " have been deleted")
Err err ->
processApiError err model
UpdateUser result ->
case result of
Ok username ->
(model, getUsersConf model)
|> createSuccessNotification (username ++ " have been modified")
Err err ->
processApiError err model
AddRole r ->
({model | rolesToAddOnSave = r :: model.rolesToAddOnSave}, Cmd.none)
RemoveRole user provider r ->
let
-- remove role, and also authz that are associated to the role but not associated with any other remaining role
newRoles = Dict.get provider user.providersInfo |> Maybe.map .roles |> Maybe.withDefault [] |> List.filter (\x -> r /= x)
newAuthz =
-- keep authz if it is found in any authz of newRoles
-- keep authz if it's in custom authz of the user
let
allAuthz = Dict.toList model.roles |> List.FlatMap.flatMap (\(role, authz) -> if List.member role newRoles then authz else [])
in
user.customRights ++ List.filter (\x ->
case model.roles |> Dict.get x of
Just _ -> True
Nothing ->
newRoles
|> List.any (\y -> List.member y allAuthz)
) user.authz
newUser = {login = user.login, authz = newAuthz, roles = newRoles}
newPanelMode = EditMode {user | authz = newAuthz, roles = newRoles}
in
({model | panelMode = newPanelMode}, updateUser model user.login (DataTypes.AddUserForm newUser "" model.isHashedPasswd))
Notification subMsg ->
Toasty.update defaultConfig Notification subMsg model
Password newPassword ->
({model | isValidInput = ValidInputs, password = newPassword}, Cmd.none)
Login newLogin ->
({model | isValidInput = ValidInputs, login = newLogin}, Cmd.none)
SubmitUpdatedInfos u ->
({model | rolesToAddOnSave = [], password = "", userForcePasswdInput = False, login = ""}, updateUser model u.login (DataTypes.AddUserForm u model.password model.isHashedPasswd))
SubmitNewUser u ->
if(isEmpty u.login) then
({model | isValidInput = InvalidUsername}, Cmd.none)
else
({ model |
panelMode = Closed
, login = ""
, password = ""
, userForcePasswdInput = False
, isHashedPasswd = True
, isValidInput = ValidInputs
, rolesToAddOnSave = []
}
, addUser model (DataTypes.AddUserForm u model.password model.isHashedPasswd)
)
PreHashedPasswd bool ->
({model | password = "",isHashedPasswd = bool}, Cmd.none)
AddPasswdAnyway ->
if (model.userForcePasswdInput) then
({model | userForcePasswdInput = False, password = ""}, Cmd.none)
else
({model | userForcePasswdInput = True}, Cmd.none)
OpenDeleteModal username ->
({model | openDeleteModal = True, login = username}, Cmd.none)
CloseDeleteModal ->
({model | openDeleteModal = False, login = ""}, Cmd.none)
processApiError : Error -> Model -> ( Model, Cmd Msg )
processApiError err model =
let
newModel =
{ model | digest = "", users = fromList []}
in
( newModel, Cmd.none ) |> createErrorNotification "Error while trying to fetch settings." err