diff --git a/lib/client/client.go b/lib/client/client.go index ed178e03d8c5f..d13590c7d7492 100644 --- a/lib/client/client.go +++ b/lib/client/client.go @@ -59,6 +59,7 @@ import ( "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/sshutils" "github.com/gravitational/teleport/lib/sshutils/sftp" + "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/utils/socks" ) @@ -218,6 +219,18 @@ func (proxy *ProxyClient) GetLeafClusters(ctx context.Context) ([]types.RemoteCl return remoteClusters, nil } +// RouteToDatabaseToProto converts tlsca.RouteToDatabase to the proto version +// that is used for ReissueParams. +func RouteToDatabaseToProto(dbRoute tlsca.RouteToDatabase) proto.RouteToDatabase { + return proto.RouteToDatabase{ + ServiceName: dbRoute.ServiceName, + Protocol: dbRoute.Protocol, + Username: dbRoute.Username, + Database: dbRoute.Database, + Roles: dbRoute.Roles, + } +} + // ReissueParams encodes optional parameters for // user certificate reissue. type ReissueParams struct { diff --git a/lib/client/client_test.go b/lib/client/client_test.go index 432f51a47de17..08d1f851dc722 100644 --- a/lib/client/client_test.go +++ b/lib/client/client_test.go @@ -34,9 +34,11 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/crypto/ssh" + "github.com/gravitational/teleport/api/client/proto" tracessh "github.com/gravitational/teleport/api/observability/tracing/ssh" "github.com/gravitational/teleport/lib/observability/tracing" "github.com/gravitational/teleport/lib/sshutils" + "github.com/gravitational/teleport/lib/tlsca" ) func TestHelperFunctions(t *testing.T) { @@ -357,3 +359,21 @@ func TestLineLabeledWriter(t *testing.T) { }) } } + +func TestRouteToDatabaseToProto(t *testing.T) { + input := tlsca.RouteToDatabase{ + ServiceName: "db-service", + Database: "db-name", + Username: "db-user", + Protocol: "db-protocol", + Roles: []string{"db-role1", "db-role2"}, + } + expected := proto.RouteToDatabase{ + ServiceName: "db-service", + Database: "db-name", + Username: "db-user", + Protocol: "db-protocol", + Roles: []string{"db-role1", "db-role2"}, + } + require.Equal(t, expected, RouteToDatabaseToProto(input)) +} diff --git a/lib/client/local_proxy_middleware.go b/lib/client/local_proxy_middleware.go index 2ae55e1036db7..06d8f9c1c6892 100644 --- a/lib/client/local_proxy_middleware.go +++ b/lib/client/local_proxy_middleware.go @@ -93,15 +93,10 @@ func (c *DBCertChecker) renewCerts(ctx context.Context, lp *alpnproxy.LocalProxy var key *Key if err := RetryWithRelogin(ctx, c.tc, func() error { newKey, err := c.tc.IssueUserCertsWithMFA(ctx, ReissueParams{ - RouteToCluster: c.tc.SiteName, - RouteToDatabase: proto.RouteToDatabase{ - ServiceName: c.dbRoute.ServiceName, - Protocol: c.dbRoute.Protocol, - Username: c.dbRoute.Username, - Database: c.dbRoute.Database, - }, - AccessRequests: accessRequests, - RequesterName: proto.UserCertsRequest_TSH_DB_LOCAL_PROXY_TUNNEL, + RouteToCluster: c.tc.SiteName, + RouteToDatabase: RouteToDatabaseToProto(c.dbRoute), + AccessRequests: accessRequests, + RequesterName: proto.UserCertsRequest_TSH_DB_LOCAL_PROXY_TUNNEL, }, mfa.WithPromptReasonSessionMFA("database", c.dbRoute.ServiceName)) key = newKey return trace.Wrap(err) diff --git a/lib/teleterm/clusters/cluster_databases.go b/lib/teleterm/clusters/cluster_databases.go index dc92cbc9e6da5..ded1abd4b07e1 100644 --- a/lib/teleterm/clusters/cluster_databases.go +++ b/lib/teleterm/clusters/cluster_databases.go @@ -136,13 +136,9 @@ func (c *Cluster) reissueDBCerts(ctx context.Context, proxyClient *client.ProxyC // Fetch the certs for the database. err = proxyClient.ReissueUserCerts(ctx, client.CertCacheKeep, client.ReissueParams{ - RouteToCluster: c.clusterClient.SiteName, - RouteToDatabase: proto.RouteToDatabase{ - ServiceName: routeToDatabase.ServiceName, - Protocol: routeToDatabase.Protocol, - Username: routeToDatabase.Username, - }, - AccessRequests: c.status.ActiveRequests, + RouteToCluster: c.clusterClient.SiteName, + RouteToDatabase: client.RouteToDatabaseToProto(routeToDatabase), + AccessRequests: c.status.ActiveRequests, }) if err != nil { return trace.Wrap(err) diff --git a/tool/tsh/common/db.go b/tool/tsh/common/db.go index 8ea157ad27f25..c06ff9a143357 100644 --- a/tool/tsh/common/db.go +++ b/tool/tsh/common/db.go @@ -319,15 +319,9 @@ func databaseLogin(cf *CLIConf, tc *client.TeleportClient, dbInfo *databaseInfo) } else { if err = client.RetryWithRelogin(cf.Context, tc, func() error { key, err = tc.IssueUserCertsWithMFA(cf.Context, client.ReissueParams{ - RouteToCluster: tc.SiteName, - RouteToDatabase: proto.RouteToDatabase{ - ServiceName: dbInfo.ServiceName, - Protocol: dbInfo.Protocol, - Username: dbInfo.Username, - Database: dbInfo.Database, - Roles: dbInfo.Roles, - }, - AccessRequests: profile.ActiveRequests, + RouteToCluster: tc.SiteName, + RouteToDatabase: client.RouteToDatabaseToProto(dbInfo.RouteToDatabase), + AccessRequests: profile.ActiveRequests, }) return trace.Wrap(err) }); err != nil {