Skip to content

Commit b8bf4c7

Browse files
alnrory-bot
authored andcommitted
feat: autoconfigure kratos-changefeed
GitOrigin-RevId: 8e684d3c1ed528798c0c81cc4330858c54a39acf
1 parent 7d0d7f6 commit b8bf4c7

File tree

8 files changed

+148
-13
lines changed

8 files changed

+148
-13
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ replace (
1515
// official SDK, allowing for the Ory CLI to consume Ory Kratos' CLI commands.
1616
github.com/ory/client-go => ./internal/client-go
1717
github.com/ory/x => ./oryx
18-
1918
)
2019

2120
require (
@@ -24,7 +23,6 @@ require (
2423
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0
2524
github.com/bradleyjkemp/cupaloy/v2 v2.8.0
2625
github.com/bwmarrin/discordgo v0.28.1
27-
github.com/cenkalti/backoff v2.2.1+incompatible
2826
github.com/coreos/go-oidc/v3 v3.11.0
2927
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
3028
github.com/dghubble/oauth1 v0.7.3
@@ -99,6 +97,8 @@ require (
9997
google.golang.org/grpc v1.74.2
10098
)
10199

100+
require github.com/cenkalti/backoff v2.2.1+incompatible
101+
102102
require (
103103
filippo.io/edwards25519 v1.1.0 // indirect
104104
github.com/a8m/envsubst v1.4.2 // indirect

oryx/ipx/cidr.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright © 2025 Ory Corp
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package ipx
5+
6+
import (
7+
"iter"
8+
"net/netip"
9+
)
10+
11+
func Hosts(prefix netip.Prefix) iter.Seq[netip.Addr] {
12+
prefix = prefix.Masked()
13+
return func(yield func(netip.Addr) bool) {
14+
if !prefix.IsValid() {
15+
return
16+
}
17+
for addr := prefix.Addr().Next(); prefix.Contains(addr); addr = addr.Next() {
18+
if !yield(addr) {
19+
return
20+
}
21+
}
22+
}
23+
}

oryx/logrusx/helper.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"errors"
99
"fmt"
10+
"log"
1011
"net/http"
1112
"net/url"
1213
"reflect"
@@ -276,3 +277,17 @@ func (l *Logger) PopLogger(lvl logging.Level, s string, args ...interface{}) {
276277
l.WithField("source", "pop").Logf(level, s, args...)
277278
}
278279
}
280+
281+
func (l *Logger) StdLogger(lvl logrus.Level) *log.Logger {
282+
return log.New(writer{l.Logger, lvl}, "", 0)
283+
}
284+
285+
type writer struct {
286+
l *logrus.Logger
287+
lvl logrus.Level
288+
}
289+
290+
func (w writer) Write(p []byte) (n int, err error) {
291+
w.l.Log(w.lvl, strings.TrimSuffix(string(p), "\n"))
292+
return len(p), nil
293+
}

oryx/logrusx/logrus.go

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"net/http"
1212
"os"
1313
"strings"
14+
"testing"
1415
"time"
1516

1617
"github.com/sirupsen/logrus"
@@ -52,7 +53,8 @@ const ConfigSchemaID = "ory://logging-config"
5253
// The interface is specified instead of `jsonschema.Compiler` to allow the use of any jsonschema library fork or version.
5354
func AddConfigSchema(c interface {
5455
AddResource(url string, r io.Reader) error
55-
}) error {
56+
},
57+
) error {
5658
return c.AddResource(ConfigSchemaID, bytes.NewBufferString(ConfigSchema))
5759
}
5860

@@ -233,10 +235,32 @@ func New(name string, version string, opts ...Option) *Logger {
233235
return o.c.Strings("log.additional_redacted_headers")
234236
}()),
235237
Entry: newLogger(o.l, o).WithFields(logrus.Fields{
236-
"audience": "application", "service_name": name, "service_version": version}),
238+
"audience": "application", "service_name": name, "service_version": version,
239+
}),
237240
}
238241
}
239242

243+
func NewT(t testing.TB, opts ...Option) *Logger {
244+
opts = append(opts, LeakSensitive(), WithExitFunc(func(code int) {
245+
t.Fatalf("Logger exited with code %d", code)
246+
}))
247+
l := New(t.Name(), "test", opts...)
248+
l.Logger.Out = &testOutput{t}
249+
return l
250+
}
251+
252+
type testOutput struct {
253+
t testing.TB
254+
}
255+
256+
func (t *testOutput) Write(p []byte) (n int, err error) {
257+
if t.t == nil {
258+
return os.Stdout.Write(p)
259+
}
260+
t.t.Log(t.t.Name() + " " + string(p))
261+
return len(p), nil
262+
}
263+
240264
func NewAudit(name string, version string, opts ...Option) *Logger {
241265
return New(name, version, opts...).WithField("audience", "audit")
242266
}

oryx/popx/db_columns.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
// Copyright © 2025 Ory Corp
2+
// SPDX-License-Identifier: Apache-2.0
3+
14
package popx
25

36
import (

oryx/popx/migrator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ import (
1515
"time"
1616

1717
"github.com/cockroachdb/cockroach-go/v2/crdb"
18-
"github.com/ory/pop/v6"
1918
"github.com/pkg/errors"
2019
"go.opentelemetry.io/otel/attribute"
2120
"go.opentelemetry.io/otel/trace"
2221

22+
"github.com/ory/pop/v6"
2323
"github.com/ory/x/cmdx"
2424
"github.com/ory/x/logrusx"
2525
"github.com/ory/x/otelx"

oryx/reqlog/middleware.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,18 @@ func (m *Middleware) ExcludePaths(paths ...string) *Middleware {
102102
return m
103103
}
104104

105+
func (m *Middleware) Wrap(handler http.Handler) http.Handler {
106+
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
107+
m.ServeHTTP(rw, r, handler.ServeHTTP)
108+
})
109+
}
110+
111+
func (m *Middleware) WrapFunc(handler http.HandlerFunc) http.HandlerFunc {
112+
return func(rw http.ResponseWriter, r *http.Request) {
113+
m.ServeHTTP(rw, r, handler)
114+
}
115+
}
116+
105117
func (m *Middleware) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
106118
if m.Before == nil {
107119
m.Before = DefaultBefore

oryx/tlsx/cert.go

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"math/big"
2222
"os"
2323
"path/filepath"
24+
"slices"
2425
"sync/atomic"
2526
"testing"
2627
"time"
@@ -222,8 +223,8 @@ func PublicKey(key crypto.PrivateKey) interface{ Equal(x crypto.PublicKey) bool
222223
}
223224

224225
// CreateSelfSignedTLSCertificate creates a self-signed TLS certificate.
225-
func CreateSelfSignedTLSCertificate(key interface{}) (*tls.Certificate, error) {
226-
c, err := CreateSelfSignedCertificate(key)
226+
func CreateSelfSignedTLSCertificate(key interface{}, opts ...CertificateOpts) (*tls.Certificate, error) {
227+
c, err := CreateSelfSignedCertificate(key, opts...)
227228
if err != nil {
228229
return nil, err
229230
}
@@ -244,7 +245,7 @@ func CreateSelfSignedTLSCertificate(key interface{}) (*tls.Certificate, error) {
244245
}
245246

246247
// CreateSelfSignedCertificate creates a self-signed x509 certificate.
247-
func CreateSelfSignedCertificate(key interface{}) (cert *x509.Certificate, err error) {
248+
func CreateSelfSignedCertificate(key interface{}, opts ...CertificateOpts) (cert *x509.Certificate, err error) {
248249
serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
249250
serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
250251
if err != nil {
@@ -263,14 +264,16 @@ func CreateSelfSignedCertificate(key interface{}) (cert *x509.Certificate, err e
263264
},
264265
NotBefore: time.Now().UTC(),
265266
NotAfter: time.Now().UTC().Add(time.Hour * 24 * 31),
266-
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
267-
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
267+
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,
268+
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth, x509.ExtKeyUsageClientAuth},
268269
BasicConstraintsValid: true,
270+
IsCA: true,
271+
DNSNames: []string{"localhost"},
272+
}
273+
for _, opt := range opts {
274+
opt(certificate)
269275
}
270276

271-
certificate.IsCA = true
272-
certificate.KeyUsage |= x509.KeyUsageCertSign
273-
certificate.DNSNames = append(certificate.DNSNames, "localhost")
274277
der, err := x509.CreateCertificate(rand.Reader, certificate, certificate, PublicKey(key), key)
275278
if err != nil {
276279
return cert, errors.Errorf("failed to create certificate: %s", err)
@@ -292,6 +295,61 @@ func PEMBlockForKey(key interface{}) (*pem.Block, error) {
292295
return &pem.Block{Type: "PRIVATE KEY", Bytes: b}, nil
293296
}
294297

298+
// NewClientCert creates a new client TLS certificate signed by the given CA.
299+
func NewClientCert(CAcert *x509.Certificate, CAkey crypto.PrivateKey, opts ...CertificateOpts) (*tls.Certificate, error) {
300+
if !slices.Contains(CAcert.ExtKeyUsage, x509.ExtKeyUsageClientAuth) {
301+
return nil, errors.Errorf("the CA certificate does not have the client authentication extended key usage (OID 1.3.6.1.5.5.7.3.2) set")
302+
}
303+
serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
304+
serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
305+
if err != nil {
306+
return nil, errors.Errorf("failed to generate serial number: %s", err)
307+
}
308+
309+
key, err := rsa.GenerateKey(rand.Reader, 3072)
310+
if err != nil {
311+
return nil, errors.Errorf("failed to generate private key: %s", err)
312+
}
313+
314+
template := &x509.Certificate{
315+
SerialNumber: serialNumber,
316+
Subject: pkix.Name{
317+
Organization: []string{"Ory GmbH"},
318+
CommonName: "ORY",
319+
},
320+
Issuer: CAcert.Subject,
321+
NotBefore: time.Now().UTC(),
322+
NotAfter: CAcert.NotAfter,
323+
KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment,
324+
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
325+
BasicConstraintsValid: true,
326+
IsCA: false,
327+
}
328+
for _, opt := range opts {
329+
opt(template)
330+
}
331+
332+
der, err := x509.CreateCertificate(rand.Reader, template, CAcert, PublicKey(key), CAkey)
333+
if err != nil {
334+
return nil, errors.Errorf("failed to create certificate: %s", err)
335+
}
336+
337+
pemCert := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: der})
338+
pemBlock, err := PEMBlockForKey(key)
339+
if err != nil {
340+
return nil, err
341+
}
342+
pemKey := pem.EncodeToMemory(pemBlock)
343+
344+
cert, err := tls.X509KeyPair(pemCert, pemKey)
345+
if err != nil {
346+
return nil, errors.WithStack(err)
347+
}
348+
return &cert, nil
349+
}
350+
351+
type CertificateOpts func(*x509.Certificate)
352+
295353
// CreateSelfSignedCertificateForTest writes a new, self-signed TLS
296354
// certificate+key (in PEM format) to a temporary location on disk and returns
297355
// the paths to both, and the respective contents in base64 encoding. The

0 commit comments

Comments
 (0)