44 "context"
55 goerrors "errors"
66 "fmt"
7+ "maps"
78 "slices"
89
910 "github.com/go-crypt/crypt"
@@ -202,8 +203,16 @@ func NewStore(ctx context.Context, kvStore kv.Store, useHashedTokens bool, opts
202203 return nil , fmt .Errorf ("error during authorization store setup: %w" , err )
203204 }
204205
206+ foundVariants , err := s .findHashVariants (ctx )
207+ if err != nil {
208+ return nil , fmt .Errorf ("error creating authorization store during findVariants: %w" , err )
209+ }
210+ if len (foundVariants ) > 0 && ! useHashedTokens {
211+ s .log .Warn ("Token hashing is disabled, but hashed tokens found in authorization store. Was influxd accidentally started without --use-hashed-tokens?" )
212+ }
213+
205214 if s .hasher == nil {
206- hasher , err := s .autogenerateHasher (ctx , s .hasherVariantName )
215+ hasher , err := s .autogenerateHasher (ctx , foundVariants , s .hasherVariantName )
207216 if err != nil {
208217 return nil , fmt .Errorf ("error creating authorization store during autogenerateHasher: %w" , err )
209218 }
@@ -220,10 +229,8 @@ func NewStore(ctx context.Context, kvStore kv.Store, useHashedTokens bool, opts
220229 return s .Store , nil
221230}
222231
223- // autogenerateHasher generates an AuthorizationHasher that hashes using variantName.
224- // The decoders include variantName plus any other variants that are detected in the
225- // store.
226- func (s * Store ) autogenerateHasher (ctx context.Context , variantName string ) (* AuthorizationHasher , error ) {
232+ // findHashVariants scans all authorizations and returns a list of hash variants found.
233+ func (s * Store ) findHashVariants (ctx context.Context ) ([]influxdb2_algo.Variant , error ) {
227234 // Determine which variants are present in the store.
228235 tempDecoder := crypt .NewDecoder ()
229236 if err := influxdb2_algo .RegisterDecoder (tempDecoder ); err != nil {
@@ -251,16 +258,25 @@ func (s *Store) autogenerateHasher(ctx context.Context, variantName string) (*Au
251258 if influxdbDigest , ok := digest .(* influxdb2_algo.Digest ); ok {
252259 foundVariants [influxdbDigest .Variant ] = struct {}{}
253260 }
261+ } else {
262+ s .log .Warn ("error decoding hash variant for token during hash variant inventory" , zap .Error (err ), zap .Uint64 ("tokenID" , uint64 (a .ID )))
254263 }
255264 }
256265 }
257266
267+ return slices .Collect (maps .Keys (foundVariants )), nil
268+ }
269+
270+ // autogenerateHasher generates an AuthorizationHasher that hashes using variantName.
271+ // The decoders include variantName plus any other variants that are included in
272+ // foundVariants.
273+ func (s * Store ) autogenerateHasher (ctx context.Context , foundVariants []influxdb2_algo.Variant , variantName string ) (* AuthorizationHasher , error ) {
258274 var decoderVariants []influxdb2_algo.Variant
259275 // Make sure we have the hasher variant we will make in there and that it is first in the list,
260276 // so that it is the first one we try to lookup a given token.
261277 hasherVariant := influxdb2_algo .NewVariant (variantName )
262278 decoderVariants = append (decoderVariants , hasherVariant )
263- for variant := range foundVariants {
279+ for _ , variant := range foundVariants {
264280 // Avoid having 2 hasherVariant decoders.
265281 if variant != hasherVariant {
266282 decoderVariants = append (decoderVariants , variant )
0 commit comments