| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 | package logicimport (	"encoding/json"	"fmt"	"github.com/google/uuid"	"github.com/gravitl/netmaker/database"	"github.com/gravitl/netmaker/logic"	"github.com/gravitl/netmaker/models")func MigrateToUUIDs() {	roles, err := ListNetworkRoles()	if err != nil {		return	}	rolesMapping := make(map[models.UserRoleID]models.UserRoleID)	for _, role := range roles {		if role.Default {			continue		}		_, err := uuid.Parse(string(role.ID))		if err == nil {			// role id is already an uuid, so no need to update			continue		}		oldRoleID := role.ID		role.ID = models.UserRoleID(uuid.NewString())		rolesMapping[oldRoleID] = role.ID		roleBytes, err := json.Marshal(role)		if err != nil {			continue		}		err = database.Insert(role.ID.String(), string(roleBytes), database.USER_PERMISSIONS_TABLE_NAME)		if err != nil {			continue		}		err = database.DeleteRecord(database.USER_PERMISSIONS_TABLE_NAME, oldRoleID.String())		if err != nil {			continue		}	}	groups, err := ListUserGroups()	if err != nil {		return	}	groupsMapping := make(map[models.UserGroupID]models.UserGroupID)	for _, group := range groups {		if group.Default {			continue		}		_, err := uuid.Parse(string(group.ID))		if err == nil {			// group id is already an uuid, so no need to update			continue		}		oldGroupID := group.ID		group.ID = models.UserGroupID(uuid.NewString())		groupsMapping[oldGroupID] = group.ID		var groupPermissions = make(map[models.NetworkID]map[models.UserRoleID]struct{})		for networkID, networkRoles := range group.NetworkRoles {			groupPermissions[networkID] = make(map[models.UserRoleID]struct{})			for roleID := range networkRoles {				newRoleID, ok := rolesMapping[roleID]				if !ok {					groupPermissions[networkID][roleID] = struct{}{}				} else {					groupPermissions[networkID][newRoleID] = struct{}{}				}			}		}		group.NetworkRoles = groupPermissions		groupBytes, err := json.Marshal(group)		if err != nil {			continue		}		err = database.Insert(group.ID.String(), string(groupBytes), database.USER_GROUPS_TABLE_NAME)		if err != nil {			continue		}		err = database.DeleteRecord(database.USER_GROUPS_TABLE_NAME, oldGroupID.String())		if err != nil {			continue		}	}	// if no changes were made, there are no references to be updated.	if len(rolesMapping) == 0 && len(groupsMapping) == 0 {		return	}	users, err := logic.GetUsersDB()	if err != nil {		return	}	for _, user := range users {		userGroups := make(map[models.UserGroupID]struct{})		for groupID := range user.UserGroups {			newGroupID, ok := groupsMapping[groupID]			if !ok {				userGroups[groupID] = struct{}{}			} else {				userGroups[newGroupID] = struct{}{}			}		}		user.UserGroups = userGroups		err = logic.UpsertUser(user)		if err != nil {			continue		}	}	for _, acl := range logic.ListAcls() {		srcList := make([]models.AclPolicyTag, len(acl.Src))		for i, src := range acl.Src {			if src.ID == models.UserGroupAclID {				newGroupID, ok := groupsMapping[models.UserGroupID(src.Value)]				if ok {					src.Value = newGroupID.String()				}			}			srcList[i] = src		}		dstList := make([]models.AclPolicyTag, len(acl.Dst))		for i, dst := range acl.Dst {			if dst.ID == models.UserGroupAclID {				newGroupID, ok := groupsMapping[models.UserGroupID(dst.Value)]				if ok {					dst.Value = newGroupID.String()				}			}			dstList[i] = dst		}		err = logic.UpsertAcl(acl)		if err != nil {			continue		}	}	invites, err := logic.ListUserInvites()	if err != nil {		return	}	for _, invite := range invites {		userGroups := make(map[models.UserGroupID]struct{})		for groupID := range invite.UserGroups {			newGroupID, ok := groupsMapping[groupID]			if !ok {				invite.UserGroups[groupID] = struct{}{}			} else {				invite.UserGroups[newGroupID] = struct{}{}			}		}		invite.UserGroups = userGroups		userPermissions := make(map[models.NetworkID]map[models.UserRoleID]struct{})		for networkID, networkRoles := range invite.NetworkRoles {			userPermissions[networkID] = make(map[models.UserRoleID]struct{})			for roleID := range networkRoles {				newRoleID, ok := rolesMapping[roleID]				if !ok {					userPermissions[networkID][roleID] = struct{}{}				} else {					userPermissions[networkID][newRoleID] = struct{}{}				}			}		}		invite.NetworkRoles = userPermissions		err = logic.InsertUserInvite(invite)		if err != nil {			continue		}	}}func MigrateUserRoleAndGroups(user models.User) {	if user.PlatformRoleID == models.AdminRole || user.PlatformRoleID == models.SuperAdminRole {		return	}	if len(user.RemoteGwIDs) > 0 {		// define user roles for network		// assign relevant network role to user		for remoteGwID := range user.RemoteGwIDs {			gwNode, err := logic.GetNodeByID(remoteGwID)			if err != nil {				continue			}			var groupID models.UserGroupID			if user.PlatformRoleID == models.ServiceUser {				groupID = GetDefaultNetworkUserGroupID(models.NetworkID(gwNode.Network))			} else {				groupID = GetDefaultNetworkAdminGroupID(models.NetworkID(gwNode.Network))			}			if err != nil {				continue			}			user.UserGroups[groupID] = struct{}{}		}	}	if len(user.NetworkRoles) > 0 {		for netID, netRoles := range user.NetworkRoles {			var groupID models.UserGroupID			adminAccess := false			for netRoleID := range netRoles {				permTemplate, err := logic.GetRole(netRoleID)				if err == nil {					if permTemplate.FullAccess {						adminAccess = true					}				}			}			if user.PlatformRoleID == models.ServiceUser {				groupID = GetDefaultNetworkUserGroupID(netID)			} else {				if adminAccess {					groupID = GetDefaultNetworkAdminGroupID(netID)				} else {					groupID = GetDefaultNetworkUserGroupID(netID)				}			}			user.UserGroups[groupID] = struct{}{}			user.NetworkRoles = make(map[models.NetworkID]map[models.UserRoleID]struct{})		}	}	logic.UpsertUser(user)}func MigrateToGws() {	nodes, err := logic.GetAllNodes()	if err != nil {		return	}	for _, node := range nodes {		if node.IsIngressGateway || node.IsRelay || node.IsInternetGateway {			node.IsGw = true			node.IsIngressGateway = true			node.IsRelay = true			if node.Tags == nil {				node.Tags = make(map[models.TagID]struct{})			}			node.Tags[models.TagID(fmt.Sprintf("%s.%s", node.Network, models.GwTagName))] = struct{}{}			delete(node.Tags, models.TagID(fmt.Sprintf("%s.%s", node.Network, models.OldRemoteAccessTagName)))			logic.UpsertNode(&node)		}		if node.IsInternetGateway && len(node.InetNodeReq.InetNodeClientIDs) > 0 {			node.RelayedNodes = append(node.RelayedNodes, node.InetNodeReq.InetNodeClientIDs...)			node.RelayedNodes = logic.UniqueStrings(node.RelayedNodes)			for _, nodeID := range node.InetNodeReq.InetNodeClientIDs {				relayedNode, err := logic.GetNodeByID(nodeID)				if err == nil {					relayedNode.IsRelayed = true					relayedNode.RelayedBy = node.ID.String()					logic.UpsertNode(&relayedNode)				}			}			logic.UpsertNode(&node)		}	}	acls := logic.ListAcls()	for _, acl := range acls {		upsert := false		for i, srcI := range acl.Src {			if srcI.ID == models.NodeTagID && srcI.Value == fmt.Sprintf("%s.%s", acl.NetworkID.String(), models.OldRemoteAccessTagName) {				srcI.Value = fmt.Sprintf("%s.%s", acl.NetworkID.String(), models.GwTagName)				acl.Src[i] = srcI				upsert = true			}		}		for i, dstI := range acl.Dst {			if dstI.ID == models.NodeTagID && dstI.Value == fmt.Sprintf("%s.%s", acl.NetworkID.String(), models.OldRemoteAccessTagName) {				dstI.Value = fmt.Sprintf("%s.%s", acl.NetworkID.String(), models.GwTagName)				acl.Dst[i] = dstI				upsert = true			}		}		if upsert {			logic.UpsertAcl(acl)		}	}	nets, _ := logic.GetNetworks()	for _, netI := range nets {		DeleteTag(models.TagID(fmt.Sprintf("%s.%s", netI.NetID, models.OldRemoteAccessTagName)), true)	}}
 |