Skip to content

Commit

Permalink
Merge 6fe3792 into 9bb4d5c
Browse files Browse the repository at this point in the history
  • Loading branch information
aeneasr committed May 31, 2023
2 parents 9bb4d5c + 6fe3792 commit a13e32e
Show file tree
Hide file tree
Showing 17 changed files with 243 additions and 33 deletions.
7 changes: 7 additions & 0 deletions identity/manager.go
Expand Up @@ -7,6 +7,10 @@ import (
"context"
"reflect"

"go.opentelemetry.io/otel/trace"

"github.com/ory/kratos/x/events"

"github.com/ory/x/otelx"

"github.com/ory/kratos/x"
Expand Down Expand Up @@ -86,6 +90,7 @@ func (m *Manager) Create(ctx context.Context, i *Identity, opts ...ManagerOption
return err
}

trace.SpanFromContext(ctx).AddEvent(events.NewIdentityCreated(ctx, i.ID))
return m.r.PrivilegedIdentityPool().CreateIdentity(ctx, i)
}

Expand Down Expand Up @@ -170,6 +175,7 @@ func (m *Manager) UpdateSchemaID(ctx context.Context, id uuid.UUID, schemaID str
return err
}

trace.SpanFromContext(ctx).AddEvent(events.NewIdentityUpdated(ctx, id))

Check warning on line 178 in identity/manager.go

View check run for this annotation

Codecov / codecov/patch

identity/manager.go#L178

Added line #L178 was not covered by tests
return m.r.PrivilegedIdentityPool().UpdateIdentity(ctx, original)
}

Expand Down Expand Up @@ -206,6 +212,7 @@ func (m *Manager) UpdateTraits(ctx context.Context, id uuid.UUID, traits Traits,
return err
}

trace.SpanFromContext(ctx).AddEvent(events.NewIdentityUpdated(ctx, id))
return m.r.PrivilegedIdentityPool().UpdateIdentity(ctx, updated)
}

Expand Down
5 changes: 3 additions & 2 deletions selfservice/flow/login/error.go
Expand Up @@ -85,13 +85,14 @@ func (s *ErrorHandler) WriteFlowError(w http.ResponseWriter, r *http.Request, f
WithField("login_flow", f).
Info("Encountered self-service login error.")

trace.SpanFromContext(r.Context()).AddEvent(events.NewLoginFailed(r.Context()))

if f == nil {
trace.SpanFromContext(r.Context()).AddEvent(events.NewLoginFailed(r.Context(), "", "", false))
s.forward(w, r, nil, err)
return
}

trace.SpanFromContext(r.Context()).AddEvent(events.NewLoginFailed(r.Context(), string(f.Type), string(f.RequestedAAL), f.Refresh))

if expired, inner := s.PrepareReplacementForExpiredFlow(w, r, f, err); inner != nil {
s.WriteFlowError(w, r, f, group, inner)
return
Expand Down
2 changes: 1 addition & 1 deletion selfservice/flow/login/handler.go
Expand Up @@ -776,7 +776,7 @@ continueLogin:
return
}

if err := h.d.LoginHookExecutor().PostLoginHook(w, r, group, f, i, sess); err != nil {
if err := h.d.LoginHookExecutor().PostLoginHook(w, r, group, f, i, sess, ""); err != nil {
if errors.Is(err, ErrAddressNotVerified) {
h.d.LoginFlowErrorHandler().WriteFlowError(w, r, f, node.DefaultGroup, errors.WithStack(schema.NewAddressNotVerifiedError()))
return
Expand Down
12 changes: 7 additions & 5 deletions selfservice/flow/login/hook.go
Expand Up @@ -114,7 +114,7 @@ func (e *HookExecutor) handleLoginError(_ http.ResponseWriter, r *http.Request,
return flowError
}

func (e *HookExecutor) PostLoginHook(w http.ResponseWriter, r *http.Request, g node.UiNodeGroup, a *Flow, i *identity.Identity, s *session.Session) (err error) {
func (e *HookExecutor) PostLoginHook(w http.ResponseWriter, r *http.Request, g node.UiNodeGroup, a *Flow, i *identity.Identity, s *session.Session, provider string) (err error) {
ctx := r.Context()
ctx, span := e.d.Tracer(ctx).Tracer().Start(ctx, "HookExecutor.PostLoginHook")
r = r.WithContext(ctx)
Expand Down Expand Up @@ -171,6 +171,12 @@ func (e *HookExecutor) PostLoginHook(w http.ResponseWriter, r *http.Request, g n
Debug("ExecuteLoginPostHook completed successfully.")
}

trace.SpanFromContext(r.Context()).AddEvent(events.NewLoginSucceeded(r.Context(), &events.LoginSucceededOpts{
SessionID: s.ID,
IdentityID: i.ID, FlowType: string(a.Type), RequestedAAL: string(a.RequestedAAL), IsRefresh: a.Refresh, Method: a.Active.String(),
SSOProvider: provider,
}))

if a.Type == flow.TypeAPI {
if err := e.d.SessionPersister().UpsertSession(r.Context(), s); err != nil {
return errors.WithStack(err)
Expand All @@ -181,8 +187,6 @@ func (e *HookExecutor) PostLoginHook(w http.ResponseWriter, r *http.Request, g n
WithField("identity_id", i.ID).
Info("Identity authenticated successfully and was issued an Ory Kratos Session Token.")

trace.SpanFromContext(r.Context()).AddEvent(events.NewSessionIssued(r.Context(), s.ID, i.ID))

if handled, err := e.d.SessionManager().MaybeRedirectAPICodeFlow(w, r, a, s.ID, g); err != nil {
return errors.WithStack(err)
} else if handled {
Expand All @@ -209,8 +213,6 @@ func (e *HookExecutor) PostLoginHook(w http.ResponseWriter, r *http.Request, g n
WithField("session_id", s.ID).
Info("Identity authenticated successfully and was issued an Ory Kratos Session Cookie.")

trace.SpanFromContext(r.Context()).AddEvent(events.NewSessionIssued(r.Context(), s.ID, i.ID))

if x.IsJSONRequest(r) {
// Browser flows rely on cookies. Adding tokens in the mix will confuse consumers.
s.Token = ""
Expand Down
2 changes: 1 addition & 1 deletion selfservice/flow/login/hook_test.go
Expand Up @@ -65,7 +65,7 @@ func TestLoginExecutor(t *testing.T) {
}

testhelpers.SelfServiceHookLoginErrorHandler(t, w, r,
reg.LoginHookExecutor().PostLoginHook(w, r, strategy.ToUiNodeGroup(), a, useIdentity, sess))
reg.LoginHookExecutor().PostLoginHook(w, r, strategy.ToUiNodeGroup(), a, useIdentity, sess, ""))
})

ts := httptest.NewServer(router)
Expand Down
7 changes: 7 additions & 0 deletions selfservice/flow/recovery/error.go
Expand Up @@ -7,6 +7,10 @@ import (
"net/http"
"net/url"

"go.opentelemetry.io/otel/trace"

"github.com/ory/kratos/x/events"

"github.com/ory/x/sqlxx"

"github.com/ory/kratos/ui/node"
Expand Down Expand Up @@ -67,10 +71,13 @@ func (s *ErrorHandler) WriteFlowError(
Info("Encountered self-service recovery error.")

if f == nil {
trace.SpanFromContext(r.Context()).AddEvent(events.NewRecoveryFailed(r.Context(), "", ""))
s.forward(w, r, nil, err)
return
}

trace.SpanFromContext(r.Context()).AddEvent(events.NewRecoveryFailed(r.Context(), string(f.Type), f.Active.String()))

if e := new(flow.ExpiredError); errors.As(err, &e) {
strategy, err := s.d.RecoveryStrategies(r.Context()).Strategy(f.Active.String())
if err != nil {
Expand Down
6 changes: 6 additions & 0 deletions selfservice/flow/recovery/hook.go
Expand Up @@ -8,6 +8,10 @@ import (
"fmt"
"net/http"

"go.opentelemetry.io/otel/trace"

"github.com/ory/kratos/x/events"

"github.com/ory/kratos/driver/config"
"github.com/ory/kratos/identity"
"github.com/ory/kratos/selfservice/flow"
Expand Down Expand Up @@ -98,6 +102,8 @@ func (e *HookExecutor) PostRecoveryHook(w http.ResponseWriter, r *http.Request,
Debug("ExecutePostRecoveryHook completed successfully.")
}

trace.SpanFromContext(r.Context()).AddEvent(events.NewRecoverySucceeded(r.Context(), s.Identity.ID, string(a.Type), a.Active.String()))

e.d.Logger().
WithRequest(r).
WithField("identity_id", s.Identity.ID).
Expand Down
4 changes: 2 additions & 2 deletions selfservice/flow/registration/error.go
Expand Up @@ -91,12 +91,12 @@ func (s *ErrorHandler) WriteFlowError(
WithField("registration_flow", f).
Info("Encountered self-service flow error.")

trace.SpanFromContext(r.Context()).AddEvent(events.NewRegistrationFailed(r.Context()))

if f == nil {
trace.SpanFromContext(r.Context()).AddEvent(events.NewRegistrationFailed(r.Context(), "", ""))
s.forward(w, r, nil, err)
return
}
trace.SpanFromContext(r.Context()).AddEvent(events.NewRegistrationFailed(r.Context(), string(f.Type), f.Active.String()))

if expired, inner := s.PrepareReplacementForExpiredFlow(w, r, f, err); inner != nil {
s.forward(w, r, f, err)
Expand Down
2 changes: 1 addition & 1 deletion selfservice/flow/registration/hook.go
Expand Up @@ -172,7 +172,7 @@ func (e *HookExecutor) PostRegistrationHook(w http.ResponseWriter, r *http.Reque
WithField("identity_id", i.ID).
Info("A new identity has registered using self-service registration.")

trace.SpanFromContext(r.Context()).AddEvent(events.NewIdentityCreated(r.Context(), i.ID))
trace.SpanFromContext(r.Context()).AddEvent(events.NewRegistrationSucceeded(r.Context(), i.ID, string(a.Type), a.Active.String(), provider))

s := session.NewInactiveSession()
s.CompletedLoginForWithProvider(ct, identity.AuthenticatorAssuranceLevel1, provider)
Expand Down
8 changes: 7 additions & 1 deletion selfservice/flow/settings/error.go
Expand Up @@ -8,6 +8,10 @@ import (
"net/http"
"net/url"

"go.opentelemetry.io/otel/trace"

"github.com/ory/kratos/x/events"

"github.com/ory/kratos/session"
"github.com/ory/kratos/x/swagger"

Expand Down Expand Up @@ -167,9 +171,11 @@ func (s *ErrorHandler) WriteFlowError(
}

if f == nil {
s.forward(w, r, f, err)
trace.SpanFromContext(r.Context()).AddEvent(events.NewSettingsFailed(r.Context(), "", ""))
s.forward(w, r, nil, err)
return
}
trace.SpanFromContext(r.Context()).AddEvent(events.NewSettingsFailed(r.Context(), string(f.Type), f.Active.String()))

if expired, inner := s.PrepareReplacementForExpiredFlow(w, r, f, id, err); inner != nil {
s.forward(w, r, f, err)
Expand Down
6 changes: 6 additions & 0 deletions selfservice/flow/settings/hook.go
Expand Up @@ -9,6 +9,10 @@ import (
"net/http"
"time"

"go.opentelemetry.io/otel/trace"

"github.com/ory/kratos/x/events"

"github.com/ory/kratos/session"

"github.com/ory/kratos/text"
Expand Down Expand Up @@ -278,6 +282,8 @@ func (e *HookExecutor) PostSettingsHook(w http.ResponseWriter, r *http.Request,
WithField("flow_method", settingsType).
Debug("Completed all PostSettingsPrePersistHooks and PostSettingsPostPersistHooks.")

trace.SpanFromContext(r.Context()).AddEvent(events.NewSettingsSucceeded(r.Context(), i.ID, string(ctxUpdate.Flow.Type), ctxUpdate.Flow.Active.String()))

if ctxUpdate.Flow.Type == flow.TypeAPI {
updatedFlow, err := e.d.SettingsFlowPersister().GetSettingsFlow(r.Context(), ctxUpdate.Flow.ID)
if err != nil {
Expand Down
6 changes: 6 additions & 0 deletions selfservice/flow/verification/error.go
Expand Up @@ -7,6 +7,10 @@ import (
"net/http"
"net/url"

"go.opentelemetry.io/otel/trace"

"github.com/ory/kratos/x/events"

"github.com/ory/kratos/ui/node"

"github.com/pkg/errors"
Expand Down Expand Up @@ -65,9 +69,11 @@ func (s *ErrorHandler) WriteFlowError(
Info("Encountered self-service verification error.")

if f == nil {
trace.SpanFromContext(r.Context()).AddEvent(events.NewVerificationFailed(r.Context(), "", ""))
s.forward(w, r, nil, err)
return
}
trace.SpanFromContext(r.Context()).AddEvent(events.NewVerificationFailed(r.Context(), string(f.Type), f.Active.String()))

if e := new(flow.ExpiredError); errors.As(err, &e) {
strategy, err := s.d.VerificationStrategies(r.Context()).Strategy(f.Active.String())
Expand Down
6 changes: 6 additions & 0 deletions selfservice/flow/verification/hook.go
Expand Up @@ -8,6 +8,10 @@ import (
"fmt"
"net/http"

"go.opentelemetry.io/otel/trace"

"github.com/ory/kratos/x/events"

"github.com/ory/kratos/driver/config"
"github.com/ory/kratos/identity"
"github.com/ory/kratos/selfservice/flow"
Expand Down Expand Up @@ -108,6 +112,8 @@ func (e *HookExecutor) PostVerificationHook(w http.ResponseWriter, r *http.Reque
Debug("ExecutePostVerificationHook completed successfully.")
}

trace.SpanFromContext(r.Context()).AddEvent(events.NewVerificationSucceeded(r.Context(), i.ID, string(a.Type), a.Active.String()))

e.d.Logger().
WithRequest(r).
WithField("identity_id", i.ID).
Expand Down
6 changes: 0 additions & 6 deletions selfservice/hook/session_issuer.go
Expand Up @@ -8,13 +8,9 @@ import (
"net/http"
"time"

"go.opentelemetry.io/otel/trace"

"github.com/ory/kratos/identity"
"github.com/ory/kratos/ui/node"

"github.com/ory/kratos/x/events"

"github.com/pkg/errors"

"github.com/ory/kratos/driver/config"
Expand Down Expand Up @@ -62,8 +58,6 @@ func (e *SessionIssuer) executePostRegistrationPostPersistHook(w http.ResponseWr
return err
}

trace.SpanFromContext(r.Context()).AddEvent(events.NewSessionIssued(r.Context(), s.ID, s.IdentityID))

if a.Type == flow.TypeAPI {
if s.AuthenticatedVia(identity.CredentialsTypeOIDC) {
if handled, err := e.r.SessionManager().MaybeRedirectAPICodeFlow(w, r, a, s.ID, node.OpenIDConnectGroup); err != nil {
Expand Down
2 changes: 1 addition & 1 deletion selfservice/strategy/oidc/strategy_login.go
Expand Up @@ -139,7 +139,7 @@ func (s *Strategy) processLogin(w http.ResponseWriter, r *http.Request, a *login
sess.CompletedLoginForWithProvider(s.ID(), identity.AuthenticatorAssuranceLevel1, provider.Config().ID)
for _, c := range o.Providers {
if c.Subject == claims.Subject && c.Provider == provider.Config().ID {
if err = s.d.LoginHookExecutor().PostLoginHook(w, r, node.OpenIDConnectGroup, a, i, sess); err != nil {
if err = s.d.LoginHookExecutor().PostLoginHook(w, r, node.OpenIDConnectGroup, a, i, sess, provider.Config().ID); err != nil {
return nil, s.handleError(w, r, a, provider.Config().ID, nil, err)
}
return nil, nil
Expand Down
11 changes: 11 additions & 0 deletions session/manager_http.go
Expand Up @@ -9,6 +9,10 @@ import (
"net/url"
"time"

"go.opentelemetry.io/otel/trace"

"github.com/ory/kratos/x/events"

"github.com/ory/kratos/selfservice/flow"
"github.com/ory/kratos/selfservice/sessiontokenexchange"
"github.com/ory/kratos/ui/node"
Expand Down Expand Up @@ -65,6 +69,7 @@ func (s *ManagerHTTP) UpsertAndIssueCookie(ctx context.Context, w http.ResponseW
ctx, span := s.r.Tracer(ctx).Tracer().Start(ctx, "sessions.ManagerHTTP.UpsertAndIssueCookie")
defer otelx.End(span, &err)

isNew := ss.ID == uuid.Nil
if err := s.r.SessionPersister().UpsertSession(ctx, ss); err != nil {
return err
}
Expand All @@ -73,6 +78,12 @@ func (s *ManagerHTTP) UpsertAndIssueCookie(ctx context.Context, w http.ResponseW
return err
}

var event = events.NewSessionChanged
if isNew {
event = events.NewSessionIssued
}

trace.SpanFromContext(r.Context()).AddEvent(event(r.Context(), string(ss.AuthenticatorAssuranceLevel), ss.ID, ss.IdentityID))
return nil
}

Expand Down

0 comments on commit a13e32e

Please sign in to comment.