...

Source file src/edge-infra.dev/pkg/edge/iam/storage/database/storage_authorize_code.go

Documentation: edge-infra.dev/pkg/edge/iam/storage/database

     1  //nolint:dupl
     2  package database
     3  
     4  import (
     5  	"context"
     6  	"time"
     7  
     8  	"edge-infra.dev/pkg/edge/iam/config"
     9  	"edge-infra.dev/pkg/edge/iam/storage"
    10  
    11  	"github.com/go-redis/redis"
    12  	"github.com/ory/fosite"
    13  	"github.com/pkg/errors"
    14  )
    15  
    16  func (s *Store) CreateAuthorizeCodeSession(_ context.Context, code string, req fosite.Requester) (err error) {
    17  	key := keyFrom(KeyPrefixAuthorizationCode, code)
    18  	r := storage.ToStorage(code, req)
    19  	return s.set(key, r, config.GetAuthCodeTTL())
    20  }
    21  
    22  func (s *Store) GetAuthorizeCodeSession(ctx context.Context, code string, session fosite.Session) (request fosite.Requester, err error) {
    23  	key := keyFrom(KeyPrefixAuthorizationCode, code)
    24  	req, err := s.get(key)
    25  	if err == redis.Nil {
    26  		return nil, errors.Wrap(fosite.ErrNotFound, "")
    27  	} else if err != nil {
    28  		return nil, errors.WithStack(err)
    29  	}
    30  
    31  	// Transform to a fosite.Request
    32  	iamClient, err := s.GetIAMClient(ctx, req.ClientID)
    33  	if err != nil {
    34  		s.Log.Info("failed to get client in db", "error", err, "id", req.ClientID)
    35  		return nil, err
    36  	}
    37  	request, err = req.ToFositeRequest(ctx, session, iamClient)
    38  	if err != nil {
    39  		if err == fosite.ErrNotFound {
    40  			s.Log.Info("Failed to transform a fosite session to a fosite request.", "error", err)
    41  			return nil, err
    42  		}
    43  
    44  		return nil, err
    45  	}
    46  
    47  	if !req.Active {
    48  		// If the authorization code has been invalidated with
    49  		// `InvalidateAuthorizeCodeSession`, this method should return the
    50  		// ErrInvalidatedAuthorizeCode error.
    51  		// Make sure to also return the fosite.Requester value when returning
    52  		// the ErrInvalidatedAuthorizeCode error!
    53  		return request, fosite.ErrInvalidatedAuthorizeCode
    54  	}
    55  
    56  	return request, err
    57  }
    58  
    59  func (s *Store) InvalidateAuthorizeCodeSession(_ context.Context, code string) (err error) {
    60  	key := keyFrom(KeyPrefixAuthorizationCode, code)
    61  	req, err := s.get(key)
    62  	if err == redis.Nil {
    63  		return errors.Wrap(fosite.ErrNotFound, "")
    64  	} else if err != nil {
    65  		return errors.WithStack(err)
    66  	}
    67  
    68  	req.UpdateTime = time.Now().Unix()
    69  	req.Active = false
    70  
    71  	// push the update back to redis
    72  	err = s.set(key, *req, config.GetAuthCodeTTL())
    73  	if err != nil {
    74  		return errors.Wrap(err, "Failed to set session as invalidated")
    75  	}
    76  
    77  	return nil
    78  }
    79  

View as plain text