leaf *x509.Certificate
chain []*x509.Certificate
root *x509.Certificate
+ subs map[mtls.SubscriptionHandle]mtls.ReloadNotifyFunc
}
+var _ mtls.CertificateProvider = &MintCertificate{}
+
type clientImpl struct {
log log.Logger
defaultCtx context.Context
m.chain = newCert.chain
m.private = newCert.private
m.scheduleRenew()
+ m.notifyWatchers()
return nil
}
"errors"
"sync/atomic"
+ "gopkg.in/yaml.v3"
+
"go.fuhry.dev/runtime/mtls"
"go.fuhry.dev/runtime/utils/log"
- "gopkg.in/yaml.v3"
)
type mintIdentityProviderFactory struct{}
var depth atomic.Int32
+func (c *MintCertificate) Subscribe(f mtls.ReloadNotifyFunc) mtls.SubscriptionHandle {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+
+ if c.subs == nil {
+ c.subs = make(map[mtls.SubscriptionHandle]mtls.ReloadNotifyFunc)
+ }
+
+ h := mtls.NewSubscriptionHandle()
+ c.subs[h] = f
+ return h
+}
+
+func (c *MintCertificate) Unsubscribe(h mtls.SubscriptionHandle) {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+
+ if c.subs == nil {
+ return
+ }
+
+ delete(c.subs, h)
+}
+
+func (c *MintCertificate) notifyWatchers() {
+ // copy the notify handlers
+ c.mu.Lock()
+ if c.subs == nil {
+ c.mu.Unlock()
+ return
+ }
+
+ var watchers []mtls.ReloadNotifyFunc
+ for _, f := range c.subs {
+ watchers = append(watchers, f)
+ }
+ c.mu.Unlock()
+
+ for _, f := range watchers {
+ f(c.leaf, c.private, c.chain, c.root)
+ }
+}
+
func tryGetMintIdentity(cls mtls.PrincipalClass, name string) (mtls.CertificateProvider, error) {
if cls != mtls.ServicePrincipal {
return nil, mtls.ErrUnsupportedClass
}
func init() {
- mtls.RegisterIdentityDriver("mint", tryGetMintIdentity)
mtls.RegisterProviderFactory("mint", &mintIdentityProviderFactory{})
}