networkuser.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package pro
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/gravitl/netmaker/database"
  6. "github.com/gravitl/netmaker/models"
  7. "github.com/gravitl/netmaker/models/promodels"
  8. )
  9. // InitializeNetworkUsers - intializes network users for a given network
  10. func InitializeNetworkUsers(network string) error {
  11. _, err := database.FetchRecord(database.NETWORK_USER_TABLE_NAME, network)
  12. if err != nil && database.IsEmptyRecord(err) {
  13. newNetUserMap := make(promodels.NetworkUserMap)
  14. netUserData, err := json.Marshal(newNetUserMap)
  15. if err != nil {
  16. return err
  17. }
  18. return database.Insert(network, string(netUserData), database.NETWORK_USER_TABLE_NAME)
  19. }
  20. return err
  21. }
  22. // GetNetworkUsers - gets the network users table
  23. func GetNetworkUsers(network string) (promodels.NetworkUserMap, error) {
  24. currentUsers, err := database.FetchRecord(database.NETWORK_USER_TABLE_NAME, network)
  25. if err != nil {
  26. return nil, err
  27. }
  28. var userMap promodels.NetworkUserMap
  29. if err = json.Unmarshal([]byte(currentUsers), &userMap); err != nil {
  30. return nil, err
  31. }
  32. return userMap, nil
  33. }
  34. // CreateNetworkUser - adds a network user to db
  35. func CreateNetworkUser(network *models.Network, user *promodels.NetworkUser) error {
  36. if DoesNetworkUserExist(network.NetID, user.ID) {
  37. return nil
  38. }
  39. currentUsers, err := GetNetworkUsers(network.NetID)
  40. if err != nil {
  41. return err
  42. }
  43. user.SetDefaults()
  44. currentUsers.Add(user)
  45. data, err := json.Marshal(currentUsers)
  46. if err != nil {
  47. return err
  48. }
  49. return database.Insert(network.NetID, string(data), database.NETWORK_USER_TABLE_NAME)
  50. }
  51. // DeleteNetworkUser - deletes a network user and removes from all networks
  52. func DeleteNetworkUser(network, userid string) error {
  53. currentUsers, err := GetNetworkUsers(network)
  54. if err != nil {
  55. return err
  56. }
  57. currentUsers.Delete(promodels.NetworkUserID(userid))
  58. data, err := json.Marshal(currentUsers)
  59. if err != nil {
  60. return err
  61. }
  62. return database.Insert(network, string(data), database.NETWORK_USER_TABLE_NAME)
  63. }
  64. // DissociateNetworkUserNode - removes a node from a given user's node list
  65. func DissociateNetworkUserNode(userid, networkid, nodeid string) error {
  66. nuser, err := GetNetworkUser(networkid, promodels.NetworkUserID(userid))
  67. if err != nil {
  68. return err
  69. }
  70. for i, n := range nuser.Nodes {
  71. if n == nodeid {
  72. nuser.Nodes = removeStringIndex(nuser.Nodes, i)
  73. break
  74. }
  75. }
  76. return UpdateNetworkUser(networkid, nuser)
  77. }
  78. // DissociateNetworkUserClient - removes a client from a given user's client list
  79. func DissociateNetworkUserClient(userid, networkid, clientid string) error {
  80. nuser, err := GetNetworkUser(networkid, promodels.NetworkUserID(userid))
  81. if err != nil {
  82. return err
  83. }
  84. for i, n := range nuser.Clients {
  85. if n == clientid {
  86. nuser.Clients = removeStringIndex(nuser.Clients, i)
  87. break
  88. }
  89. }
  90. return UpdateNetworkUser(networkid, nuser)
  91. }
  92. // AssociateNetworkUserClient - removes a client from a given user's client list
  93. func AssociateNetworkUserClient(userid, networkid, clientid string) error {
  94. nuser, err := GetNetworkUser(networkid, promodels.NetworkUserID(userid))
  95. if err != nil {
  96. return err
  97. }
  98. var found bool
  99. for _, n := range nuser.Clients {
  100. if n == clientid {
  101. found = true
  102. break
  103. }
  104. }
  105. if found {
  106. return nil
  107. } else {
  108. nuser.Clients = append(nuser.Clients, clientid)
  109. }
  110. return UpdateNetworkUser(networkid, nuser)
  111. }
  112. func removeStringIndex(s []string, index int) []string {
  113. ret := make([]string, 0)
  114. ret = append(ret, s[:index]...)
  115. return append(ret, s[index+1:]...)
  116. }
  117. // GetNetworkUser - fetches a network user from a given network
  118. func GetNetworkUser(network string, userID promodels.NetworkUserID) (*promodels.NetworkUser, error) {
  119. currentUsers, err := GetNetworkUsers(network)
  120. if err != nil {
  121. return nil, err
  122. }
  123. if currentUsers[userID].ID == "" {
  124. return nil, fmt.Errorf("user %s does not exist", userID)
  125. }
  126. currentNetUser := currentUsers[userID]
  127. return &currentNetUser, nil
  128. }
  129. // DoesNetworkUserExist - check if networkuser exists
  130. func DoesNetworkUserExist(network string, userID promodels.NetworkUserID) bool {
  131. _, err := GetNetworkUser(network, userID)
  132. return err == nil
  133. }
  134. // UpdateNetworkUser - gets a network user from given network
  135. func UpdateNetworkUser(network string, newUser *promodels.NetworkUser) error {
  136. currentUsers, err := GetNetworkUsers(network)
  137. if err != nil {
  138. return err
  139. }
  140. currentUsers[newUser.ID] = *newUser
  141. newUsersData, err := json.Marshal(&currentUsers)
  142. if err != nil {
  143. return err
  144. }
  145. return database.Insert(network, string(newUsersData), database.NETWORK_USER_TABLE_NAME)
  146. }
  147. // RemoveAllNetworkUsers - removes all network users from given network
  148. func RemoveAllNetworkUsers(network string) error {
  149. return database.DeleteRecord(database.NETWORK_USER_TABLE_NAME, network)
  150. }
  151. // IsUserNodeAllowed - given a list of nodes, determine if the user's node is allowed based on ID
  152. // Checks if node is in given nodes list as well as being in user's list
  153. func IsUserNodeAllowed(nodes []models.Node, network, userID, nodeID string) bool {
  154. netUser, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
  155. if err != nil {
  156. return false
  157. }
  158. for i := range nodes {
  159. if nodes[i].ID.String() == nodeID {
  160. for j := range netUser.Nodes {
  161. if netUser.Nodes[j] == nodeID {
  162. return true
  163. }
  164. }
  165. }
  166. }
  167. return false
  168. }
  169. // IsUserClientAllowed - given a list of clients, determine if the user's client is allowed based on ID
  170. // Checks if client is in given ext client list as well as being in user's list
  171. func IsUserClientAllowed(clients []models.ExtClient, network, userID, clientID string) bool {
  172. netUser, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
  173. if err != nil {
  174. return false
  175. }
  176. for i := range clients {
  177. if clients[i].ClientID == clientID {
  178. for j := range netUser.Clients {
  179. if netUser.Clients[j] == clientID {
  180. return true
  181. }
  182. }
  183. }
  184. }
  185. return false
  186. }
  187. // IsUserNetAdmin - checks if a user is a net admin or not
  188. func IsUserNetAdmin(network, userID string) bool {
  189. user, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
  190. if err != nil {
  191. return false
  192. }
  193. return user.AccessLevel == NET_ADMIN
  194. }
  195. // MakeNetAdmin - makes a given user a network admin on given network
  196. func MakeNetAdmin(network, userID string) (ok bool) {
  197. user, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
  198. if err != nil {
  199. return ok
  200. }
  201. user.AccessLevel = NET_ADMIN
  202. if err = UpdateNetworkUser(network, user); err != nil {
  203. return ok
  204. }
  205. return true
  206. }
  207. // AssignAccessLvl - gives a user a specified access level
  208. func AssignAccessLvl(network, userID string, accesslvl int) (ok bool) {
  209. user, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
  210. if err != nil {
  211. return ok
  212. }
  213. user.AccessLevel = accesslvl
  214. if err = UpdateNetworkUser(network, user); err != nil {
  215. return ok
  216. }
  217. return true
  218. }