Skip to content

Commit a2d3613

Browse files
committed
dataprovider: preserve initial sort order for related resources
Folders and groups now retain their initial order, improving compatibility and predictability when used with Terraform Signed-off-by: Nicola Murino <[email protected]>
1 parent 81a9813 commit a2d3613

File tree

9 files changed

+506
-93
lines changed

9 files changed

+506
-93
lines changed

internal/dataprovider/bolt.go

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import (
3939
)
4040

4141
const (
42-
boltDatabaseVersion = 32
42+
boltDatabaseVersion = 33
4343
)
4444

4545
var (
@@ -446,9 +446,6 @@ func (p *BoltProvider) addAdmin(admin *Admin) error {
446446
admin.LastLogin = 0
447447
admin.CreatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
448448
admin.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
449-
sort.Slice(admin.Groups, func(i, j int) bool {
450-
return admin.Groups[i].Name < admin.Groups[j].Name
451-
})
452449
for idx := range admin.Groups {
453450
err = p.addAdminToGroupMapping(admin.Username, admin.Groups[idx].Name, groupBucket)
454451
if err != nil {
@@ -507,9 +504,6 @@ func (p *BoltProvider) updateAdmin(admin *Admin) error {
507504
if err = p.addAdminToRole(admin.Username, admin.Role, rolesBucket); err != nil {
508505
return err
509506
}
510-
sort.Slice(admin.Groups, func(i, j int) bool {
511-
return admin.Groups[i].Name < admin.Groups[j].Name
512-
})
513507
for idx := range admin.Groups {
514508
err = p.addAdminToGroupMapping(admin.Username, admin.Groups[idx].Name, groupBucket)
515509
if err != nil {
@@ -721,18 +715,12 @@ func (p *BoltProvider) addUser(user *User) error {
721715
if err := p.addUserToRole(user.Username, user.Role, rolesBucket); err != nil {
722716
return err
723717
}
724-
sort.Slice(user.VirtualFolders, func(i, j int) bool {
725-
return user.VirtualFolders[i].Name < user.VirtualFolders[j].Name
726-
})
727718
for idx := range user.VirtualFolders {
728719
err = p.addRelationToFolderMapping(user.VirtualFolders[idx].Name, user, nil, foldersBucket)
729720
if err != nil {
730721
return err
731722
}
732723
}
733-
sort.Slice(user.Groups, func(i, j int) bool {
734-
return user.Groups[i].Name < user.Groups[j].Name
735-
})
736724
for idx := range user.Groups {
737725
err = p.addUserToGroupMapping(user.Username, user.Groups[idx].Name, groupBucket)
738726
if err != nil {
@@ -1504,9 +1492,6 @@ func (p *BoltProvider) addGroup(group *Group) error {
15041492
group.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
15051493
group.Users = nil
15061494
group.Admins = nil
1507-
sort.Slice(group.VirtualFolders, func(i, j int) bool {
1508-
return group.VirtualFolders[i].Name < group.VirtualFolders[j].Name
1509-
})
15101495
for idx := range group.VirtualFolders {
15111496
err = p.addRelationToFolderMapping(group.VirtualFolders[idx].Name, nil, group, foldersBucket)
15121497
if err != nil {
@@ -1549,9 +1534,6 @@ func (p *BoltProvider) updateGroup(group *Group) error {
15491534
return err
15501535
}
15511536
}
1552-
sort.Slice(group.VirtualFolders, func(i, j int) bool {
1553-
return group.VirtualFolders[i].Name < group.VirtualFolders[j].Name
1554-
})
15551537
for idx := range group.VirtualFolders {
15561538
err = p.addRelationToFolderMapping(group.VirtualFolders[idx].Name, nil, group, foldersBucket)
15571539
if err != nil {
@@ -3185,13 +3167,15 @@ func (p *BoltProvider) migrateDatabase() error {
31853167
providerLog(logger.LevelError, "%v", err)
31863168
logger.ErrorToConsole("%v", err)
31873169
return err
3188-
case version == 29, version == 30, version == 31:
3189-
logger.InfoToConsole("updating database schema version: %d -> 32", version)
3190-
providerLog(logger.LevelInfo, "updating database schema version: %d -> 32", version)
3191-
if err := updateEventActions(); err != nil {
3192-
return err
3170+
case version == 29, version == 30, version == 31, version == 32:
3171+
logger.InfoToConsole("updating database schema version: %d -> 33", version)
3172+
providerLog(logger.LevelInfo, "updating database schema version: %d -> 33", version)
3173+
if version <= 31 {
3174+
if err := updateEventActions(); err != nil {
3175+
return err
3176+
}
31933177
}
3194-
return updateBoltDatabaseVersion(p.dbHandle, 32)
3178+
return updateBoltDatabaseVersion(p.dbHandle, 33)
31953179
default:
31963180
if version > boltDatabaseVersion {
31973181
providerLog(logger.LevelError, "database schema version %d is newer than the supported one: %d", version,
@@ -3213,10 +3197,10 @@ func (p *BoltProvider) revertDatabase(targetVersion int) error { //nolint:gocycl
32133197
return errors.New("current version match target version, nothing to do")
32143198
}
32153199
switch dbVersion.Version {
3216-
case 30, 31, 32:
3200+
case 30, 31, 32, 33:
32173201
logger.InfoToConsole("downgrading database schema version: %d -> 29", dbVersion.Version)
32183202
providerLog(logger.LevelInfo, "downgrading database schema version: %d -> 29", dbVersion.Version)
3219-
if dbVersion.Version == 32 {
3203+
if dbVersion.Version >= 32 {
32203204
if err := restoreEventActions(); err != nil {
32213205
return err
32223206
}
@@ -3745,18 +3729,12 @@ func (p *BoltProvider) updateUserRelations(tx *bolt.Tx, user *User, oldUser User
37453729
if err = p.removeUserFromRole(oldUser.Username, oldUser.Role, rolesBucket); err != nil {
37463730
return err
37473731
}
3748-
sort.Slice(user.VirtualFolders, func(i, j int) bool {
3749-
return user.VirtualFolders[i].Name < user.VirtualFolders[j].Name
3750-
})
37513732
for idx := range user.VirtualFolders {
37523733
err = p.addRelationToFolderMapping(user.VirtualFolders[idx].Name, user, nil, foldersBucket)
37533734
if err != nil {
37543735
return err
37553736
}
37563737
}
3757-
sort.Slice(user.Groups, func(i, j int) bool {
3758-
return user.Groups[i].Name < user.Groups[j].Name
3759-
})
37603738
for idx := range user.Groups {
37613739
err = p.addUserToGroupMapping(user.Username, user.Groups[idx].Name, groupsBucket)
37623740
if err != nil {

internal/dataprovider/dataprovider.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ const (
113113
operationDelete = "delete"
114114
sqlPrefixValidChars = "abcdefghijklmnopqrstuvwxyz_0123456789"
115115
maxHookResponseSize = 1048576 // 1MB
116-
iso8601UTCFormat = "2006-01-02T15:04:05Z"
117116
)
118117

119118
// Supported algorithms for hashing passwords.

internal/dataprovider/memory.go

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -376,9 +376,6 @@ func (p *MemoryProvider) addUser(user *User) error {
376376
if err := p.addUserToRole(user.Username, user.Role); err != nil {
377377
return err
378378
}
379-
sort.Slice(user.Groups, func(i, j int) bool {
380-
return user.Groups[i].Name < user.Groups[j].Name
381-
})
382379
var mappedGroups []string
383380
for idx := range user.Groups {
384381
if err = p.addUserToGroupMapping(user.Username, user.Groups[idx].Name); err != nil {
@@ -390,9 +387,6 @@ func (p *MemoryProvider) addUser(user *User) error {
390387
}
391388
mappedGroups = append(mappedGroups, user.Groups[idx].Name)
392389
}
393-
sort.Slice(user.VirtualFolders, func(i, j int) bool {
394-
return user.VirtualFolders[i].Name < user.VirtualFolders[j].Name
395-
})
396390
var mappedFolders []string
397391
for idx := range user.VirtualFolders {
398392
if err = p.addUserToFolderMapping(user.Username, user.VirtualFolders[idx].Name); err != nil {
@@ -438,9 +432,6 @@ func (p *MemoryProvider) updateUser(user *User) error { //nolint:gocyclo
438432
for idx := range u.Groups {
439433
p.removeUserFromGroupMapping(u.Username, u.Groups[idx].Name)
440434
}
441-
sort.Slice(user.Groups, func(i, j int) bool {
442-
return user.Groups[i].Name < user.Groups[j].Name
443-
})
444435
for idx := range user.Groups {
445436
if err = p.addUserToGroupMapping(user.Username, user.Groups[idx].Name); err != nil {
446437
// try to add old mapping
@@ -456,9 +447,6 @@ func (p *MemoryProvider) updateUser(user *User) error { //nolint:gocyclo
456447
for _, oldFolder := range u.VirtualFolders {
457448
p.removeRelationFromFolderMapping(oldFolder.Name, u.Username, "")
458449
}
459-
sort.Slice(user.VirtualFolders, func(i, j int) bool {
460-
return user.VirtualFolders[i].Name < user.VirtualFolders[j].Name
461-
})
462450
for idx := range user.VirtualFolders {
463451
if err = p.addUserToFolderMapping(user.Username, user.VirtualFolders[idx].Name); err != nil {
464452
// try to add old mapping
@@ -771,9 +759,6 @@ func (p *MemoryProvider) addAdmin(admin *Admin) error {
771759
return err
772760
}
773761
var mappedAdmins []string
774-
sort.Slice(admin.Groups, func(i, j int) bool {
775-
return admin.Groups[i].Name < admin.Groups[j].Name
776-
})
777762
for idx := range admin.Groups {
778763
if err = p.addAdminToGroupMapping(admin.Username, admin.Groups[idx].Name); err != nil {
779764
// try to remove group mapping
@@ -816,9 +801,6 @@ func (p *MemoryProvider) updateAdmin(admin *Admin) error {
816801
for idx := range a.Groups {
817802
p.removeAdminFromGroupMapping(a.Username, a.Groups[idx].Name)
818803
}
819-
sort.Slice(admin.Groups, func(i, j int) bool {
820-
return admin.Groups[i].Name < admin.Groups[j].Name
821-
})
822804
for idx := range admin.Groups {
823805
if err = p.addAdminToGroupMapping(admin.Username, admin.Groups[idx].Name); err != nil {
824806
// try to add old mapping
@@ -1082,9 +1064,6 @@ func (p *MemoryProvider) addGroup(group *Group) error {
10821064
group.UpdatedAt = util.GetTimeAsMsSinceEpoch(time.Now())
10831065
group.Users = nil
10841066
group.Admins = nil
1085-
sort.Slice(group.VirtualFolders, func(i, j int) bool {
1086-
return group.VirtualFolders[i].Name < group.VirtualFolders[j].Name
1087-
})
10881067
var mappedFolders []string
10891068
for idx := range group.VirtualFolders {
10901069
if err = p.addGroupToFolderMapping(group.Name, group.VirtualFolders[idx].Name); err != nil {
@@ -1118,9 +1097,6 @@ func (p *MemoryProvider) updateGroup(group *Group) error {
11181097
for _, oldFolder := range g.VirtualFolders {
11191098
p.removeRelationFromFolderMapping(oldFolder.Name, "", g.Name)
11201099
}
1121-
sort.Slice(group.VirtualFolders, func(i, j int) bool {
1122-
return group.VirtualFolders[i].Name < group.VirtualFolders[j].Name
1123-
})
11241100
for idx := range group.VirtualFolders {
11251101
if err = p.addGroupToFolderMapping(group.Name, group.VirtualFolders[idx].Name); err != nil {
11261102
// try to add old mapping

internal/dataprovider/mysql.go

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,22 @@ const (
205205
"`data` longtext NOT NULL, `type` integer NOT NULL, `timestamp` bigint NOT NULL);" +
206206
"CREATE INDEX `{{prefix}}shared_sessions_type_idx` ON `{{shared_sessions}}` (`type`);" +
207207
"CREATE INDEX `{{prefix}}shared_sessions_timestamp_idx` ON `{{shared_sessions}}` (`timestamp`);"
208+
mysqlV33SQL = "ALTER TABLE `{{admins_groups_mapping}}` ADD COLUMN `sort_order` integer DEFAULT 0 NOT NULL; " +
209+
"ALTER TABLE `{{admins_groups_mapping}}` ALTER COLUMN `sort_order` DROP DEFAULT; " +
210+
"ALTER TABLE `{{groups_folders_mapping}}` ADD COLUMN `sort_order` integer DEFAULT 0 NOT NULL; " +
211+
"ALTER TABLE `{{groups_folders_mapping}}` ALTER COLUMN `sort_order` DROP DEFAULT; " +
212+
"ALTER TABLE `{{users_folders_mapping}}` ADD COLUMN `sort_order` integer DEFAULT 0 NOT NULL; " +
213+
"ALTER TABLE `{{users_folders_mapping}}` ALTER COLUMN `sort_order` DROP DEFAULT; " +
214+
"ALTER TABLE `{{users_groups_mapping}}` ADD COLUMN `sort_order` integer DEFAULT 0 NOT NULL; " +
215+
"ALTER TABLE `{{users_groups_mapping}}` ALTER COLUMN `sort_order` DROP DEFAULT; " +
216+
"CREATE INDEX `{{prefix}}admins_groups_mapping_sort_order_idx` ON `{{admins_groups_mapping}}` (`sort_order`); " +
217+
"CREATE INDEX `{{prefix}}groups_folders_mapping_sort_order_idx` ON `{{groups_folders_mapping}}` (`sort_order`); " +
218+
"CREATE INDEX `{{prefix}}users_folders_mapping_sort_order_idx` ON `{{users_folders_mapping}}` (`sort_order`);" +
219+
"CREATE INDEX `{{prefix}}users_groups_mapping_sort_order_idx` ON `{{users_groups_mapping}}` (`sort_order`);"
220+
mysqlV33DownSQL = "ALTER TABLE `{{users_groups_mapping}}` DROP COLUMN `sort_order`; " +
221+
"ALTER TABLE `{{users_folders_mapping}}` DROP COLUMN `sort_order`; " +
222+
"ALTER TABLE `{{groups_folders_mapping}}` DROP COLUMN `sort_order`; " +
223+
"ALTER TABLE `{{admins_groups_mapping}}` DROP COLUMN `sort_order`; "
208224
)
209225

210226
// MySQLProvider defines the auth provider for MySQL/MariaDB database
@@ -819,6 +835,8 @@ func (p *MySQLProvider) migrateDatabase() error {
819835
return updateMySQLDatabaseFromV30(p.dbHandle)
820836
case version == 31:
821837
return updateMySQLDatabaseFromV31(p.dbHandle)
838+
case version == 32:
839+
return updateMySQLDatabaseFromV32(p.dbHandle)
822840
default:
823841
if version > sqlDatabaseVersion {
824842
providerLog(logger.LevelError, "database schema version %d is newer than the supported one: %d", version,
@@ -847,6 +865,8 @@ func (p *MySQLProvider) revertDatabase(targetVersion int) error {
847865
return downgradeMySQLDatabaseFromV31(p.dbHandle)
848866
case 32:
849867
return downgradeMySQLDatabaseFromV32(p.dbHandle)
868+
case 33:
869+
return downgradeMySQLDatabaseFromV33(p.dbHandle)
850870
default:
851871
return fmt.Errorf("database schema version not handled: %d", dbVersion.Version)
852872
}
@@ -900,7 +920,14 @@ func updateMySQLDatabaseFromV30(dbHandle *sql.DB) error {
900920
}
901921

902922
func updateMySQLDatabaseFromV31(dbHandle *sql.DB) error {
903-
return updateSQLDatabaseFrom31To32(dbHandle)
923+
if err := updateSQLDatabaseFrom31To32(dbHandle); err != nil {
924+
return err
925+
}
926+
return updateMySQLDatabaseFromV32(dbHandle)
927+
}
928+
929+
func updateMySQLDatabaseFromV32(dbHandle *sql.DB) error {
930+
return updateMySQLDatabaseFrom32To33(dbHandle)
904931
}
905932

906933
func downgradeMySQLDatabaseFromV30(dbHandle *sql.DB) error {
@@ -921,6 +948,13 @@ func downgradeMySQLDatabaseFromV32(dbHandle *sql.DB) error {
921948
return downgradeMySQLDatabaseFromV31(dbHandle)
922949
}
923950

951+
func downgradeMySQLDatabaseFromV33(dbHandle *sql.DB) error {
952+
if err := downgradeMySQLDatabaseFrom33To32(dbHandle); err != nil {
953+
return err
954+
}
955+
return downgradeMySQLDatabaseFromV32(dbHandle)
956+
}
957+
924958
func updateMySQLDatabaseFrom29To30(dbHandle *sql.DB) error {
925959
logger.InfoToConsole("updating database schema version: 29 -> 30")
926960
providerLog(logger.LevelInfo, "updating database schema version: 29 -> 30")
@@ -954,3 +988,28 @@ func downgradeMySQLDatabaseFrom31To30(dbHandle *sql.DB) error {
954988
sql = strings.ReplaceAll(sql, "{{prefix}}", config.SQLTablesPrefix)
955989
return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, strings.Split(sql, ";"), 30, false)
956990
}
991+
992+
func updateMySQLDatabaseFrom32To33(dbHandle *sql.DB) error {
993+
logger.InfoToConsole("updating database schema version: 32 -> 33")
994+
providerLog(logger.LevelInfo, "updating database schema version: 32 -> 33")
995+
996+
sql := strings.ReplaceAll(mysqlV33SQL, "{{prefix}}", config.SQLTablesPrefix)
997+
sql = strings.ReplaceAll(sql, "{{users_folders_mapping}}", sqlTableUsersFoldersMapping)
998+
sql = strings.ReplaceAll(sql, "{{users_groups_mapping}}", sqlTableUsersGroupsMapping)
999+
sql = strings.ReplaceAll(sql, "{{admins_groups_mapping}}", sqlTableAdminsGroupsMapping)
1000+
sql = strings.ReplaceAll(sql, "{{groups_folders_mapping}}", sqlTableGroupsFoldersMapping)
1001+
sql = strings.ReplaceAll(sql, "{{prefix}}", config.SQLTablesPrefix)
1002+
return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, strings.Split(sql, ";"), 33, true)
1003+
}
1004+
1005+
func downgradeMySQLDatabaseFrom33To32(dbHandle *sql.DB) error {
1006+
logger.InfoToConsole("downgrading database schema version: 33 -> 32")
1007+
providerLog(logger.LevelInfo, "downgrading database schema version: 33 -> 32")
1008+
1009+
sql := mysqlV33DownSQL
1010+
sql = strings.ReplaceAll(sql, "{{users_folders_mapping}}", sqlTableUsersFoldersMapping)
1011+
sql = strings.ReplaceAll(sql, "{{users_groups_mapping}}", sqlTableUsersGroupsMapping)
1012+
sql = strings.ReplaceAll(sql, "{{admins_groups_mapping}}", sqlTableAdminsGroupsMapping)
1013+
sql = strings.ReplaceAll(sql, "{{groups_folders_mapping}}", sqlTableGroupsFoldersMapping)
1014+
return sqlCommonExecSQLAndUpdateDBVersion(dbHandle, strings.Split(sql, ";"), 32, false)
1015+
}

0 commit comments

Comments
 (0)