func init() { factory := func(ctx context.Context) transportFactoryFunc { return transportFactoryFunc(func() messenger.Messenger { parent := auth.ParentUPID(ctx) if parent == nil { log.Fatal("expected to have a parent UPID in context") } process := process.New("sasl_authenticatee") tpid := &upid.UPID{ ID: process.Label(), Host: parent.Host, } return messenger.NewHttpWithBindingAddress(tpid, BindingAddressFrom(ctx)) }) } delegate := auth.AuthenticateeFunc(func(ctx context.Context, handler callback.Handler) error { if impl, err := makeAuthenticatee(handler, factory(ctx)); err != nil { return err } else { return impl.Authenticate(ctx, handler) } }) if err := auth.RegisterAuthenticateeProvider(ProviderName, delegate); err != nil { log.Error(err) } }
// build a new authenticatee implementation using the given callbacks and a new transport instance func makeAuthenticatee(handler callback.Handler, factory transportFactory) (auth.Authenticatee, error) { ip := callback.NewInterprocess() if err := handler.Handle(ip); err != nil { return nil, err } config := &authenticateeConfig{ client: ip.Client(), handler: handler, transport: factory.makeTransport(), } return auth.AuthenticateeFunc(func(ctx context.Context, handler callback.Handler) error { ctx, auth := newAuthenticatee(ctx, config) auth.authenticate(ctx, ip.Server()) select { case <-ctx.Done(): return auth.discard(ctx) case <-auth.done: return auth.err } }), nil }