@@ -395,8 +395,17 @@ func (cli *client) ListClients(ctx context.Context) ([]storage.Client, error) {
395395 return nil , errors .New ("not implemented" )
396396}
397397
398- func (cli * client ) ListRefreshTokens (ctx context.Context ) ([]storage.RefreshToken , error ) {
399- return nil , errors .New ("not implemented" )
398+ func (cli * client ) ListRefreshTokens (ctx context.Context ) (tokens []storage.RefreshToken , err error ) {
399+ var refreshTokenList RefreshList
400+ if err = cli .list (resourceRefreshToken , & refreshTokenList ); err != nil {
401+ return tokens , fmt .Errorf ("failed to list passwords: %v" , err )
402+ }
403+
404+ for _ , token := range refreshTokenList .RefreshTokens {
405+ tokens = append (tokens , toStorageRefreshToken (token ))
406+ }
407+
408+ return
400409}
401410
402411func (cli * client ) ListPasswords (ctx context.Context ) (passwords []storage.Password , err error ) {
@@ -679,6 +688,25 @@ func (cli *client) GarbageCollect(ctx context.Context, now time.Time) (result st
679688 }
680689 }
681690
691+ refreshTokens , err := cli .ListRefreshTokens (ctx )
692+ if err != nil {
693+ return result , err
694+ }
695+
696+ for _ , refreshToken := range refreshTokens {
697+ matches , err := cli .refreshTokenMatchesOfflineSession (ctx , refreshToken )
698+ if err != nil {
699+ return result , err
700+ }
701+ if matches {
702+ continue
703+ }
704+ if err := cli .DeleteRefresh (ctx , refreshToken .ID ); err != nil && err != storage .ErrNotFound {
705+ cli .logger .Error ("failed to delete orphan refresh token" , "err" , err )
706+ delErr = fmt .Errorf ("failed to delete orphan refresh token: %v" , err )
707+ }
708+ }
709+
682710 var deviceTokens DeviceTokenList
683711 if err := cli .listN (resourceDeviceToken , & deviceTokens , gcResultLimit ); err != nil {
684712 return result , fmt .Errorf ("failed to list device tokens: %v" , err )
@@ -716,6 +744,19 @@ func (cli *client) GarbageCollect(ctx context.Context, now time.Time) (result st
716744 return result , delErr
717745}
718746
747+ func (cli * client ) refreshTokenMatchesOfflineSession (ctx context.Context , refreshToken storage.RefreshToken ) (bool , error ) {
748+ offlineSessions , err := cli .GetOfflineSessions (ctx , refreshToken .Claims .UserID , refreshToken .ConnectorID )
749+ if err != nil {
750+ if err == storage .ErrNotFound {
751+ return false , nil
752+ }
753+ return false , err
754+ }
755+
756+ ref := offlineSessions .Refresh [refreshToken .ClientID ]
757+ return ref != nil && ref .ID == refreshToken .ID , nil
758+ }
759+
719760func (cli * client ) CreateDeviceRequest (ctx context.Context , d storage.DeviceRequest ) error {
720761 return cli .post (resourceDeviceRequest , cli .fromStorageDeviceRequest (d ))
721762}
0 commit comments