mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-11 11:40:47 +08:00
initial commit
This commit is contained in:
247
logic/pro/networkuser.go
Normal file
247
logic/pro/networkuser.go
Normal file
@@ -0,0 +1,247 @@
|
||||
package pro
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/gravitl/netmaker/database"
|
||||
"github.com/gravitl/netmaker/models"
|
||||
"github.com/gravitl/netmaker/models/promodels"
|
||||
)
|
||||
|
||||
// InitializeNetworkUsers - intializes network users for a given network
|
||||
func InitializeNetworkUsers(network string) error {
|
||||
newNetUserMap := make(promodels.NetworkUserMap)
|
||||
netUserData, err := json.Marshal(newNetUserMap)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return database.Insert(network, string(netUserData), database.NETWORK_USER_TABLE_NAME)
|
||||
}
|
||||
|
||||
// GetNetworkUsers - gets the network users table
|
||||
func GetNetworkUsers(network string) (promodels.NetworkUserMap, error) {
|
||||
currentUsers, err := database.FetchRecord(database.NETWORK_USER_TABLE_NAME, network)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var userMap promodels.NetworkUserMap
|
||||
if err = json.Unmarshal([]byte(currentUsers), &userMap); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return userMap, nil
|
||||
}
|
||||
|
||||
// CreateNetworkUser - adds a network user to db
|
||||
func CreateNetworkUser(network *models.Network, user *promodels.NetworkUser) error {
|
||||
|
||||
if DoesNetworkUserExist(network.NetID, user.ID) {
|
||||
return nil
|
||||
}
|
||||
|
||||
currentUsers, err := GetNetworkUsers(network.NetID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
currentUsers.Add(user)
|
||||
data, err := json.Marshal(currentUsers)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return database.Insert(network.NetID, string(data), database.NETWORK_USER_TABLE_NAME)
|
||||
}
|
||||
|
||||
// DeleteNetworkUser - deletes a network user and removes from all networks
|
||||
func DeleteNetworkUser(network, userid string) error {
|
||||
currentUsers, err := GetNetworkUsers(network)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
currentUsers.Delete(promodels.NetworkUserID(userid))
|
||||
data, err := json.Marshal(currentUsers)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return database.Insert(network, string(data), database.NETWORK_USER_TABLE_NAME)
|
||||
}
|
||||
|
||||
// DissociateNetworkUserNode - removes a node from a given user's node list
|
||||
func DissociateNetworkUserNode(userid, networkid, nodeid string) error {
|
||||
nuser, err := GetNetworkUser(networkid, promodels.NetworkUserID(userid))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i, n := range nuser.Nodes {
|
||||
if n == nodeid {
|
||||
nuser.Nodes = removeStringIndex(nuser.Nodes, i)
|
||||
break
|
||||
}
|
||||
}
|
||||
return UpdateNetworkUser(networkid, nuser)
|
||||
}
|
||||
|
||||
// DissociateNetworkUserClient - removes a client from a given user's client list
|
||||
func DissociateNetworkUserClient(userid, networkid, clientid string) error {
|
||||
nuser, err := GetNetworkUser(networkid, promodels.NetworkUserID(userid))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for i, n := range nuser.Clients {
|
||||
if n == clientid {
|
||||
nuser.Clients = removeStringIndex(nuser.Clients, i)
|
||||
break
|
||||
}
|
||||
}
|
||||
return UpdateNetworkUser(networkid, nuser)
|
||||
}
|
||||
|
||||
// AssociateNetworkUserClient - removes a client from a given user's client list
|
||||
func AssociateNetworkUserClient(userid, networkid, clientid string) error {
|
||||
nuser, err := GetNetworkUser(networkid, promodels.NetworkUserID(userid))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
var found bool
|
||||
for _, n := range nuser.Clients {
|
||||
if n == clientid {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if found {
|
||||
return nil
|
||||
} else {
|
||||
nuser.Clients = append(nuser.Clients, clientid)
|
||||
}
|
||||
|
||||
return UpdateNetworkUser(networkid, nuser)
|
||||
}
|
||||
|
||||
func removeStringIndex(s []string, index int) []string {
|
||||
ret := make([]string, 0)
|
||||
ret = append(ret, s[:index]...)
|
||||
return append(ret, s[index+1:]...)
|
||||
}
|
||||
|
||||
// GetNetworkUser - fetches a network user from a given network
|
||||
func GetNetworkUser(network string, userID promodels.NetworkUserID) (*promodels.NetworkUser, error) {
|
||||
currentUsers, err := GetNetworkUsers(network)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if currentUsers[userID].ID == "" {
|
||||
return nil, fmt.Errorf("user %s does not exist", userID)
|
||||
}
|
||||
currentNetUser := currentUsers[userID]
|
||||
return ¤tNetUser, nil
|
||||
}
|
||||
|
||||
// DoesNetworkUserExist - check if networkuser exists
|
||||
func DoesNetworkUserExist(network string, userID promodels.NetworkUserID) bool {
|
||||
_, err := GetNetworkUser(network, userID)
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// UpdateNetworkUser - gets a network user from given network
|
||||
func UpdateNetworkUser(network string, newUser *promodels.NetworkUser) error {
|
||||
currentUsers, err := GetNetworkUsers(network)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
currentUsers[newUser.ID] = *newUser
|
||||
newUsersData, err := json.Marshal(¤tUsers)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return database.Insert(network, string(newUsersData), database.NETWORK_USER_TABLE_NAME)
|
||||
}
|
||||
|
||||
// RemoveAllNetworkUsers - removes all network users from given network
|
||||
func RemoveAllNetworkUsers(network string) error {
|
||||
return database.DeleteRecord(database.NETWORK_USER_TABLE_NAME, network)
|
||||
}
|
||||
|
||||
// IsUserNodeAllowed - given a list of nodes, determine if the user's node is allowed based on ID
|
||||
// Checks if node is in given nodes list as well as being in user's list
|
||||
func IsUserNodeAllowed(nodes []models.Node, network, userID, nodeID string) bool {
|
||||
|
||||
netUser, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
for i := range nodes {
|
||||
if nodes[i].ID == nodeID {
|
||||
for j := range netUser.Nodes {
|
||||
if netUser.Nodes[j] == nodeID {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// IsUserClientAllowed - given a list of clients, determine if the user's client is allowed based on ID
|
||||
// Checks if client is in given ext client list as well as being in user's list
|
||||
func IsUserClientAllowed(clients []models.ExtClient, network, userID, clientID string) bool {
|
||||
|
||||
netUser, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
for i := range clients {
|
||||
if clients[i].ClientID == clientID {
|
||||
for j := range netUser.Clients {
|
||||
if netUser.Clients[j] == clientID {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// IsUserNetAdmin - checks if a user is a net admin or not
|
||||
func IsUserNetAdmin(network, userID string) bool {
|
||||
var isAdmin bool
|
||||
user, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
|
||||
if err != nil {
|
||||
return isAdmin
|
||||
}
|
||||
return user.AccessLevel == NET_ADMIN
|
||||
}
|
||||
|
||||
// MakeNetAdmin - makes a given user a network admin on given network
|
||||
func MakeNetAdmin(network, userID string) (ok bool) {
|
||||
user, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
|
||||
if err != nil {
|
||||
return ok
|
||||
}
|
||||
user.AccessLevel = NET_ADMIN
|
||||
if err = UpdateNetworkUser(network, user); err != nil {
|
||||
return ok
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// AssignAccessLvl - gives a user a specified access level
|
||||
func AssignAccessLvl(network, userID string, accesslvl int) (ok bool) {
|
||||
user, err := GetNetworkUser(network, promodels.NetworkUserID(userID))
|
||||
if err != nil {
|
||||
return ok
|
||||
}
|
||||
user.AccessLevel = accesslvl
|
||||
if err = UpdateNetworkUser(network, user); err != nil {
|
||||
return ok
|
||||
}
|
||||
return true
|
||||
}
|
Reference in New Issue
Block a user