cmd/hub/api/filecache.go (63 lines of code) (raw):

// Copyright (c) 2022 EPAM Systems, Inc. // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. //go:build api package api import ( "errors" "hash/crc64" "io" "os" "github.com/epam/hubctl/cmd/hub/filecache" ) var crc64Table = crc64.MakeTable(crc64.ECMA) func hashLoginToken(loginToken string) uint64 { return crc64.Checksum([]byte(loginToken), crc64Table) } func loadAccessToken(apiBaseUrl, loginToken string) (*SigninResponse, error) { file, cache, err := filecache.ReadCache(os.O_RDONLY) if err != nil { return nil, err } if file != nil { file.Close() } if cache != nil { ltHash := hashLoginToken(loginToken) for _, box := range cache.AccessTokens { if apiBaseUrl == box.ApiBaseUrl && ltHash == box.LoginTokenHash { return &SigninResponse{AccessToken: box.AccessToken, RefreshToken: box.RefreshToken}, nil } } } return nil, nil } func storeAccessToken(apiBaseUrl, loginToken string, tokens *SigninResponse) error { file, cache, err := filecache.ReadCache(os.O_RDWR | os.O_CREATE) if err != nil { return err } if file == nil { return errors.New("No cache file created") } defer file.Close() _, err = file.Seek(0, io.SeekStart) if err != nil { return err } if cache == nil { cache = &filecache.FileCache{AccessTokens: make([]filecache.AccessTokenBox, 0, 1)} } ltHash := hashLoginToken(loginToken) found := false for i, b := range cache.AccessTokens { if apiBaseUrl == b.ApiBaseUrl && ltHash == b.LoginTokenHash { box := &cache.AccessTokens[i] box.AccessToken = tokens.AccessToken box.RefreshToken = tokens.RefreshToken found = true break } } if !found { box := filecache.AccessTokenBox{ApiBaseUrl: apiBaseUrl, LoginTokenHash: ltHash, AccessToken: tokens.AccessToken, RefreshToken: tokens.RefreshToken} cache.AccessTokens = append(cache.AccessTokens, box) } return filecache.WriteCache(file, cache) }