⚡ Auto cleanning up auth context cache
This commit is contained in:
		| @@ -66,14 +66,8 @@ func main() { | ||||
|  | ||||
| 	// Configure timed tasks | ||||
| 	quartz := cron.New(cron.WithLogger(cron.VerbosePrintfLogger(&log.Logger))) | ||||
| 	quartz.AddFunc("@every 60m", func() { | ||||
| 		log.Info().Msg("Running auto sign off...") | ||||
| 		if tx := services.PerformAutoSignoff(); tx.Error != nil { | ||||
| 			log.Error().Err(tx.Error).Msg("An error occurred when running auto sign off...") | ||||
| 		} else { | ||||
| 			log.Info().Int64("affected", tx.RowsAffected).Msg("Auto sign off accomplished.") | ||||
| 		} | ||||
| 	}) | ||||
| 	quartz.AddFunc("@every 60m", services.DoAutoSignoff) | ||||
| 	quartz.AddFunc("@every 60m", services.DoAutoAuthCleanup) | ||||
| 	quartz.Run() | ||||
|  | ||||
| 	// Messages | ||||
|   | ||||
| @@ -5,8 +5,10 @@ import ( | ||||
|  | ||||
| 	"git.solsynth.dev/hydrogen/identity/pkg/database" | ||||
| 	"git.solsynth.dev/hydrogen/identity/pkg/models" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| 	"github.com/rs/zerolog/log" | ||||
| 	"github.com/spf13/viper" | ||||
| 	"gorm.io/gorm" | ||||
| 	"go.etcd.io/bbolt" | ||||
| ) | ||||
|  | ||||
| func LookupSessionWithToken(tokenId string) (models.AuthSession, error) { | ||||
| @@ -21,7 +23,50 @@ func LookupSessionWithToken(tokenId string) (models.AuthSession, error) { | ||||
| 	return session, nil | ||||
| } | ||||
|  | ||||
| func PerformAutoSignoff() *gorm.DB { | ||||
| 	signoffDuration := time.Duration(viper.GetInt64("security.auto_signoff_duration")) * time.Second | ||||
| 	return database.C.Where("last_grant_at < ?", time.Now().Add(-signoffDuration)).Delete(&models.AuthSession{}) | ||||
| func DoAutoSignoff() { | ||||
| 	duration := time.Duration(viper.GetInt64("security.auto_signoff_duration")) * time.Second | ||||
| 	divider := time.Now().Add(-duration) | ||||
|  | ||||
| 	log.Debug().Time("before", divider).Msg("Now auto signing off sessions...") | ||||
|  | ||||
| 	if tx := database.C. | ||||
| 		Where("last_grant_at < ?", divider). | ||||
| 		Delete(&models.AuthSession{}); tx.Error != nil { | ||||
| 		log.Error().Err(tx.Error).Msg("An error occurred when running auto sign off...") | ||||
| 	} else { | ||||
| 		log.Debug().Int64("affected", tx.RowsAffected).Msg("Auto sign off accomplished.") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func DoAutoAuthCleanup() { | ||||
| 	log.Debug().Msg("Now auto cleaning up cached auth context...") | ||||
|  | ||||
| 	count := 0 | ||||
| 	err := database.B.Batch(func(tx *bbolt.Tx) error { | ||||
| 		bucket := tx.Bucket([]byte(authContextBucket)) | ||||
| 		if bucket == nil { | ||||
| 			return nil | ||||
| 		} | ||||
|  | ||||
| 		cursor := bucket.Cursor() | ||||
|  | ||||
| 		var ctx models.AuthContext | ||||
| 		for key, val := cursor.First(); key != nil; key, val = cursor.Next() { | ||||
| 			if err := jsoniter.Unmarshal(val, &ctx); err != nil { | ||||
| 				bucket.Delete(key) | ||||
| 				count++ | ||||
| 			} else if time.Now().Unix() >= ctx.ExpiredAt.Unix() { | ||||
| 				bucket.Delete(key) | ||||
| 				count++ | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return nil | ||||
| 	}) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		log.Error().Err(err).Msg("An error occurred when running auth context cleanup...") | ||||
| 	} else { | ||||
| 		log.Debug().Int("affected", count).Msg("Clean up auth context accomplished.") | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user