package database import ( "context" "edge-infra.dev/pkg/edge/iam/config" "edge-infra.dev/pkg/edge/iam/storage" "github.com/go-redis/redis" "github.com/ory/fosite" "github.com/pkg/errors" ) // CreateOpenIDConnectSession creates an open id connect session // for a given authorize code. This is relevant for explicit open id connect flow. func (s *Store) CreateOpenIDConnectSession(_ context.Context, authorizeCode string, req fosite.Requester) error { key := keyFrom(KeyPrefixOpenIDConnect, authorizeCode) r := storage.ToStorage(authorizeCode, req) return s.set(key, r, config.GetAuthCodeTTL()) } // IsOpenIDConnectSession returns error // - nil if a session was found, // - ErrNotFound if no session was found // - or an arbitrary error if an error occurred. func (s *Store) GetOpenIDConnectSession(ctx context.Context, authorizeCode string, requester fosite.Requester) (fosite.Requester, error) { key := keyFrom(KeyPrefixOpenIDConnect, authorizeCode) req, err := s.get(key) if err == redis.Nil { return nil, errors.Wrap(fosite.ErrNotFound, "") } else if err != nil { return nil, errors.WithStack(err) } session := requester.GetSession() // Transform to a fosite.Request iamClient, err := s.GetIAMClient(ctx, req.ClientID) if err != nil { s.Log.Info("failed to get client in db", "error", err, "id", req.ClientID) return nil, err } request, err := req.ToFositeRequest(ctx, session, iamClient) if err != nil { if err == fosite.ErrNotFound { s.Log.Info("Failed to transform a fosite session to a fosite request.", "error", err) return nil, err } return nil, err } return request, nil } // Deprecated: DeleteOpenIDConnectSession is not called from anywhere. // Originally, it should remove an open id connect session from the store. func (s *Store) DeleteOpenIDConnectSession(_ context.Context, _ string) error { return nil }