|
@@ -597,7 +597,13 @@ func CreateUserGroup(g *models.UserGroup) error {
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- return database.Insert(g.ID.String(), string(d), database.USER_GROUPS_TABLE_NAME)
|
|
|
|
|
|
+ err = database.Insert(g.ID.String(), string(d), database.USER_GROUPS_TABLE_NAME)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ // create default network gateway policies
|
|
|
|
+ CreateDefaultUserGroupNetworkPolicies(*g)
|
|
|
|
+ return nil
|
|
}
|
|
}
|
|
|
|
|
|
// GetUserGroup - fetches user group
|
|
// GetUserGroup - fetches user group
|
|
@@ -662,11 +668,16 @@ func UpdateUserGroup(g models.UserGroup) error {
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+
|
|
return database.Insert(g.ID.String(), string(d), database.USER_GROUPS_TABLE_NAME)
|
|
return database.Insert(g.ID.String(), string(d), database.USER_GROUPS_TABLE_NAME)
|
|
}
|
|
}
|
|
|
|
|
|
// DeleteUserGroup - deletes user group
|
|
// DeleteUserGroup - deletes user group
|
|
func DeleteUserGroup(gid models.UserGroupID) error {
|
|
func DeleteUserGroup(gid models.UserGroupID) error {
|
|
|
|
+ g, err := GetUserGroup(gid)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
users, err := logic.GetUsersDB()
|
|
users, err := logic.GetUsersDB()
|
|
if err != nil && !database.IsEmptyRecord(err) {
|
|
if err != nil && !database.IsEmptyRecord(err) {
|
|
return err
|
|
return err
|
|
@@ -675,6 +686,8 @@ func DeleteUserGroup(gid models.UserGroupID) error {
|
|
delete(user.UserGroups, gid)
|
|
delete(user.UserGroups, gid)
|
|
logic.UpsertUser(user)
|
|
logic.UpsertUser(user)
|
|
}
|
|
}
|
|
|
|
+ // create default network gateway policies
|
|
|
|
+ DeleteDefaultUserGroupNetworkPolicies(g)
|
|
return database.DeleteRecord(database.USER_GROUPS_TABLE_NAME, gid.String())
|
|
return database.DeleteRecord(database.USER_GROUPS_TABLE_NAME, gid.String())
|
|
}
|
|
}
|
|
|
|
|
|
@@ -745,7 +758,10 @@ func GetUserRAGNodes(user models.User) (gws map[string]models.Node) {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
if user.PlatformRoleID == models.AdminRole || user.PlatformRoleID == models.SuperAdminRole {
|
|
if user.PlatformRoleID == models.AdminRole || user.PlatformRoleID == models.SuperAdminRole {
|
|
- gws[node.ID.String()] = node
|
|
|
|
|
|
+ if ok, _ := IsUserAllowedToCommunicate(user.UserName, node); ok {
|
|
|
|
+ gws[node.ID.String()] = node
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
// check if user has network role assigned
|
|
// check if user has network role assigned
|
|
if roles, ok := user.NetworkRoles[models.NetworkID(node.Network)]; ok && len(roles) > 0 {
|
|
if roles, ok := user.NetworkRoles[models.NetworkID(node.Network)]; ok && len(roles) > 0 {
|
|
@@ -1232,6 +1248,75 @@ func UpdateUserGwAccess(currentUser, changeUser models.User) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func CreateDefaultUserGroupNetworkPolicies(g models.UserGroup) {
|
|
|
|
+ for networkID := range g.NetworkRoles {
|
|
|
|
+ network, err := logic.GetNetwork(networkID.String())
|
|
|
|
+ if err != nil {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ acl := models.Acl{
|
|
|
|
+ ID: uuid.New().String(),
|
|
|
|
+ Name: fmt.Sprintf("%s group", g.Name),
|
|
|
|
+ MetaData: "This Policy allows user group to communicate with all gateways",
|
|
|
|
+ Default: true,
|
|
|
|
+ ServiceType: models.Any,
|
|
|
|
+ NetworkID: models.NetworkID(network.NetID),
|
|
|
|
+ Proto: models.ALL,
|
|
|
|
+ RuleType: models.UserPolicy,
|
|
|
|
+ Src: []models.AclPolicyTag{
|
|
|
|
+ {
|
|
|
|
+ ID: models.UserGroupAclID,
|
|
|
|
+ Value: g.ID.String(),
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ Dst: []models.AclPolicyTag{
|
|
|
|
+ {
|
|
|
|
+ ID: models.NodeTagID,
|
|
|
|
+ Value: fmt.Sprintf("%s.%s", models.NetworkID(network.NetID), models.GwTagName),
|
|
|
|
+ }},
|
|
|
|
+ AllowedDirection: models.TrafficDirectionUni,
|
|
|
|
+ Enabled: true,
|
|
|
|
+ CreatedBy: "auto",
|
|
|
|
+ CreatedAt: time.Now().UTC(),
|
|
|
|
+ }
|
|
|
|
+ logic.InsertAcl(acl)
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func DeleteDefaultUserGroupNetworkPolicies(g models.UserGroup) {
|
|
|
|
+ for networkID := range g.NetworkRoles {
|
|
|
|
+ acls, err := logic.ListAclsByNetwork(networkID)
|
|
|
|
+ if err != nil {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, acl := range acls {
|
|
|
|
+ var hasGroupSrc bool
|
|
|
|
+ newAclSrc := make([]models.AclPolicyTag, 0)
|
|
|
|
+ for _, src := range acl.Src {
|
|
|
|
+ if src.ID == models.UserGroupAclID && src.Value == g.ID.String() {
|
|
|
|
+ hasGroupSrc = true
|
|
|
|
+ } else {
|
|
|
|
+ newAclSrc = append(newAclSrc, src)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if hasGroupSrc {
|
|
|
|
+ if len(newAclSrc) == 0 {
|
|
|
|
+ // no other src exists, delete acl.
|
|
|
|
+ _ = logic.DeleteAcl(acl)
|
|
|
|
+ } else {
|
|
|
|
+ // other sources exist, update acl.
|
|
|
|
+ acl.Src = newAclSrc
|
|
|
|
+ _ = logic.UpsertAcl(acl)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
func CreateDefaultUserPolicies(netID models.NetworkID) {
|
|
func CreateDefaultUserPolicies(netID models.NetworkID) {
|
|
if netID.String() == "" {
|
|
if netID.String() == "" {
|
|
return
|
|
return
|