Commit Graph
96 Commits
Author SHA1 Message Date
Forrest f693cfa4df rework scoped comparison helpers (#63359) 2026-03-18 21:23:25 +00:00
rob-picard-teleport 2752a106f0 Fix a resource leak in the proxy-node connection (#64337)
* Fix a resource leak in the proxy-node connection

After Dial succeeds to the node, there are a couple of error cases
where we return without closing the connection.

The happy path closes the connection in utils.ProxyConn.

defer is the simplest way to ensure it's closed with any error cases
and the extra close in the happy path does not have a negative effect

* go fmt
2026-03-06 17:07:42 +00:00
Erik Tate 5305e8279b adding missing target scope to quic dial handling and adding a few more debug logs when attempting to acquire a tunnel (#63658) 2026-02-09 22:56:26 +00:00
Edoardo Spadolini 02e797564c Add clarification for session tickets in QUIC peering (#62907) 2026-01-20 22:00:39 +00:00
Edoardo Spadolini aabe46f84f Manage TLS session tickets manually in QUIC peering (#62896)
* Manage TLS session tickets manually in QUIC peering

* Remove static assert on return types
2026-01-16 09:49:44 +00:00
rosstimothy a6a6284c88 Scopes: validate scope when dialing (#61859)
The scope of the certificate presented by agents to the reversetunnel
server is now tracked and stored with the remoteConn. Dial requests,
both local and via peers, are now populated with the scope the user
is logged into which the reversetunnel server uses to enforce that
dials for hosts are only honored if the target scope matches.
2025-12-13 00:12:57 +00:00
Maxim 4ebec265ed Add paginated ListAuthServers/ListProxies (#61702)
* types: Add `ListAuthServers`/`ListProxyServers` to PresenceService

- Add `ListAuthServers` and `ListProxyServers` RPCs to PresenceService

* feat: Implement `ListAuthServers`/`ListProxyServers`

- Implement new funcs
- Mark `GetAuthServers`/`GetProxies` deprecated
- Replace existing usages
2025-12-12 21:42:28 +00:00
Forrest ed37a545bc scoped ssh routing (#62171) 2025-12-12 00:03:37 +00:00
rosstimothy 21c5922102 Reduce flakiness of peering tests (#61054)
The changes in https://github.com/gravitational/teleport/pull/60526
resulted in the tests using different clocks to generate and validate
certificates. This updates all test helpers in the peer package
to pass around the same to ensure all time comparisons are from
the same epoch.

Closes https://github.com/gravitational/teleport/issues/60799.
2025-11-05 17:47:30 +00:00
rosstimothy fc95c42e2a Remove (auth.Server) SetClock (#60526)
The ability to alter the auth server clock existed
to allow tests to inject a fake clock. While this sounds
great it introduces opportunity for data races if other
components are already consuming the existing clock. For
example:

```

==================
WARNING: DATA RACE
Write at 0x00c003014720 by goroutine 168:
  github.com/gravitational/teleport/lib/auth.(*Server).SetClock()
      /__w/teleport.e/teleport.e/lib/auth/auth.go:2308 +0x88
  github.com/gravitational/teleport/lib/client_test.newStandaloneTeleport()
      /__w/teleport.e/teleport.e/lib/client/api_login_test.go:629 +0x11ad
  github.com/gravitational/teleport/lib/client_test.newStandaloneTeleport()
      /__w/teleport.e/teleport.e/lib/client/api_login_test.go:621 +0x1092
  github.com/gravitational/teleport/lib/client_test.TestTeleportClient_Login_local.func21()
      /__w/teleport.e/teleport.e/lib/client/api_login_test.go:290 +0x14e
  testing.tRunner()
      /opt/go/src/testing/testing.go:1934 +0x21c
  testing.(*T).Run.gowrap1()
      /opt/go/src/testing/testing.go:1997 +0x44

Previous read at 0x00c003014720 by goroutine 9018:
  github.com/gravitational/teleport/lib/auth.(*Server).GenerateHostCerts()
      /__w/teleport.e/teleport.e/lib/auth/auth.go:5127 +0x59d
  github.com/gravitational/teleport/lib/auth.GenerateIdentity()
      /__w/teleport.e/teleport.e/lib/auth/init.go:1606 +0x450
  github.com/gravitational/teleport/lib/service.(*TeleportProcess).reRegister()
      /__w/teleport.e/teleport.e/lib/service/connect.go:450 +0x25a
  github.com/gravitational/teleport/lib/service.(*TeleportProcess).rotate()
      /__w/teleport.e/teleport.e/lib/service/connect.go:1160 +0xaa7
  github.com/gravitational/teleport/lib/service.(*TeleportProcess).syncServiceRotationState()
      /__w/teleport.e/teleport.e/lib/service/connect.go:1017 +0x20b
  github.com/gravitational/teleport/lib/service.(*TeleportProcess).syncRotationState()
      /__w/teleport.e/teleport.e/lib/service/connect.go:996 +0x1c9
  github.com/gravitational/teleport/lib/service.(*TeleportProcess).syncRotationStateAndBroadcast()
      /__w/teleport.e/teleport.e/lib/service/connect.go:962 +0x4e
  github.com/gravitational/teleport/lib/service.(*TeleportProcess).syncRotationStateCycle()
      /__w/teleport.e/teleport.e/lib/service/connect.go:906 +0xcb
  github.com/gravitational/teleport/lib/service.(*TeleportProcess).periodicSyncRotationState()
      /__w/teleport.e/teleport.e/lib/service/connect.go:870 +0x5f3
  github.com/gravitational/teleport/lib/service.(*TeleportProcess).periodicSyncRotationState-fm()
      <autogenerated>:1 +0x33
  github.com/gravitational/teleport/lib/service.(*LocalService).Serve()
      /__w/teleport.e/teleport.e/lib/service/supervisor.go:605 +0x35
  github.com/gravitational/teleport/lib/service.(*LocalSupervisor).serve.func1()
      /__w/teleport.e/teleport.e/lib/service/supervisor.go:328 +0x4a2

Goroutine 168 (running) created at:
  testing.(*T).Run()
      /opt/go/src/testing/testing.go:1997 +0x9d2
  github.com/gravitational/teleport/lib/client_test.TestTeleportClient_Login_local()
      /__w/teleport.e/teleport.e/lib/client/api_login_test.go:285 +0x691
  testing.tRunner()
      /opt/go/src/testing/testing.go:1934 +0x21c
  testing.(*T).Run.gowrap1()
      /opt/go/src/testing/testing.go:1997 +0x44

Goroutine 9018 (running) created at:
  github.com/gravitational/teleport/lib/service.(*LocalSupervisor).serve()
      /__w/teleport.e/teleport.e/lib/service/supervisor.go:317 +0x10a
  github.com/gravitational/teleport/lib/service.(*LocalSupervisor).Start()
      /__w/teleport.e/teleport.e/lib/service/supervisor.go:360 +0x2f6
  github.com/gravitational/teleport/lib/client_test.startAndWait()
      /__w/teleport.e/teleport.e/lib/client/api_login_test.go:804 +0x91
  github.com/gravitational/teleport/lib/client_test.startAndWait()
      /__w/teleport.e/teleport.e/lib/client/api_login_test.go:802 +0x45
  github.com/gravitational/teleport/lib/client_test.newStandaloneTeleport()
      /__w/teleport.e/teleport.e/lib/client/api_login_test.go:621 +0x1092
  github.com/gravitational/teleport/lib/client_test.TestTeleportClient_Login_local.func21()
      /__w/teleport.e/teleport.e/lib/client/api_login_test.go:290 +0x14e
  testing.tRunner()
      /opt/go/src/testing/testing.go:1934 +0x21c
  testing.(*T).Run.gowrap1()
      /opt/go/src/testing/testing.go:1997 +0x44
==================  
```

The setter is also redundant - Auth already exposes a way
to be constructed with a custom clock. In order to get rid
of the races once and for all, the clock setter was removed and
all tests have been updated to plumb the clock through on
construction.
2025-10-29 15:19:44 +00:00
rosstimothy 348699d998 Improve tsh ssh error messages (#60099)
Fixes https://github.com/gravitational/teleport/issues/60055 and
https://github.com/gravitational/teleport/issues/53267.

Errors emitted when access is denied or hosts are missing from
the inventory have been updated to be clearer to end users.

The current error when connecting to a host that does not exist

```bash
$ tsh ssh tim@fake-host
ERROR: failed connecting to host fake-host:0: failed to receive cluster details response
failed to dial target host
direct dialing to nodes not found in inventory is not supported
```

has been updated to remove ancillary details that have zero meaning to anyone
other than a Teleport developer and better clarify the host does not exist.

```
$ tsh ssh tim@fake-host 
ERROR: failed connecting to host fake-host: target host fake-host is offline or does not exist
```

The access denied error


```
$ tsh ssh tim@server01 uptime
ERROR: access denied to tim connecting to server01:0
```


has had a relatively minor and possibly unnoticed
change to omit the port from the dial target.


```
$ tsh ssh tim@server01 uptime
ERROR: access denied to tim connecting to server01
```

fix: use net.SplitHostPort instead of strings.Cut
2025-10-14 12:59:18 +00:00
Edoardo Spadolini 9be346c58f Relay SSH routing logic and transport server (#58855)
* Relay SSH routing logic and transport server

* peer client changes
2025-09-25 15:18:03 +00:00
Brian JoergerandForrest 40cebb4b59 Make TargetServer a required field in the forwarding server (#58700)
* Make targetServer a required field in the forwarding server.

* Remove unused field.

* Update serverResolver to never return nil,nil.

* Cleanup variables in DialHost.

* Restore previous event metadata values; Update comments.

* Don't add serverID to principals if it's redundant.

* Update lib/proxy/router.go

Co-authored-by: Forrest <30576607+fspmarshall@users.noreply.github.com>

* Fix lint.

* Fix test.

---------

Co-authored-by: Forrest <30576607+fspmarshall@users.noreply.github.com>
2025-09-09 23:34:46 +00:00
Zac Bergquist 6a84aa733e Move some chatty quic logs to trace level (#58513) 2025-08-30 14:16:51 +00:00
rosstimothy 82620dc13e Refactor reversetunnelclient.Tunnel interface (#57674)
The interface has been renamed from Tunnel to ClusterGetter
and its methods were change from GetSite(s) to Cluster(s).

Updates https://github.com/gravitational/teleport/issues/19164.
2025-08-21 20:16:55 +00:00
rosstimothy 8bd0d83314 Rename reversetunnelclient.RemoteSite (#57611)
This begins the process of cleaning up legacy terminology
in lib/reversetunnel. The RemoteSite interface has been
renamed Cluster to better reflect that it represents a
Teleport cluster, either the root or leaf. The FakeRemoteSite
has been renamed to FakeCluster, and all other mock and fake
Cluster implementations have been renamed to use consitent
terminology as well. All variables holding a reference to
a cluster that were named site or had some reference to a site
have also been changed to cluster or an equivalent which
mentions cluster instead of site.

An alias to RemoteSite has been left behind so that enterprise
code can still consume it. It will be removed when the e ref
is bumped at a later time when it is no longer referenced.

Updates #19164.
2025-08-08 14:26:18 +00:00
Brian Joerger b0c67dfb78 refactor: Move ssh agent server helpers to sshagent package (#57244)
* Move lib/teleagent/server.go to lib/sshagent/server.go.

* Use NewStaticClientGetter instead of NoopCloser.

* Remove lib/sshagent dependency from sshutils package.

* Fix typo.
2025-08-05 20:57:00 +00:00
rosstimothy 7541d6d7d0 Introduce logtest package (#56741)
Moves all test related logger initialization and creation to the
logtest package to reduce testing symbols in production code. The
existing helpers in lib/utils have been left in place until the
enterprise references can be converted.

Updates #51023.
2025-07-15 18:11:10 +00:00
Edoardo Spadolini 260b7cb9e2 Trace the correct error return value in Router.DialWindowsDesktop (#56559) 2025-07-08 16:17:35 +00:00
Edoardo Spadolini 6377f46e20 Upgrade quic-go to v0.53.0 (#56302) 2025-07-01 13:52:13 +00:00
Zac Bergquist a12def583a Apply remaining modernize changes. (#56037)
This is the last of this series of updates.
2025-06-25 21:25:29 +00:00
Edoardo Spadolini 6cae865809 Try fixing the data race in peer/quic.TestBasicFunctionality (#55042) 2025-05-27 17:07:46 +00:00
Grzegorz Zdunek 6ab3d71d86 Add ProxyWindowsDesktopSession API (#54280)
* Extract reusable function for establishing connections to Windows Desktop Service

* Add `ProxyWindowsDesktopSession` proto

* Implement `ProxyWindowsDesktopSession`

* Enable fetching desktops and desktop services in remote proxy cache

* Implement dialing windows desktop

* Implement client

* Use `utils.ShuffleVisit`

* Improve stream cancellation handling

* Leave a TODO about ListWindowsDesktops

* Do not return empty data slice

* Provide non-nil src and dest addresses to `streamutils.NewConn()`

* Do not emit an empty message to indicate a successful connection

* Fix test

* Simplify code

* Require that the first message is only a dial request and the subsequent ones are only data

* Add explicit `stop()` check

* Hold cluster name and desktop name in a struct for the map key

* Do not return early on non-connection problem errors

* Handle io.EOF error specifically in BidiStreamingClient.Send instead of in `tlsConn.HandshakeContext`

* Post merge fixes
2025-05-09 06:27:52 +00:00
rosstimothy 52816e8427 Bump golangci-lint to v2 (#54410)
* Bump golangci-lint to v2

* fix lints

* update e

* fix: delete removed cli option
2025-05-07 22:14:51 +00:00
Forrest 33b2bb4ee0 refactor lib/srv to adopt pdp-style patterns (#54081) 2025-05-06 16:37:03 +00:00
3021392482 Add correct principal for agentless nodes on leaf clusters (#52803)
* Add correct principal for agentless nodes on leaf clusters

* Add host.cluster principle to initial principle list

* Add test to ensure principal is added correctly for agentless nodes

* Update lib/proxy/router.go

Co-authored-by: Edoardo Spadolini <edoardo.spadolini@goteleport.com>

* Deduplicate principals before dialing

* Update lib/proxy/router_test.go

Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>

* Add comment explaining principal for leaf cluster nodes

---------

Co-authored-by: Edoardo Spadolini <edoardo.spadolini@goteleport.com>
Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>
2025-03-14 17:17:56 +00:00
Alan Parra 911df3e313 Use loadBalancingConfig instead of loadBalancingPolicy (#51428) 2025-01-24 13:58:13 +00:00
STeve (Xin) Huang f0abbce0fd GitHub proxy part 6: proxing Git using SSH transport (#49980)
* GitHub proxy part 6: proxing Git using SSH transport

* better command parsing and update suite

* refactor

* revert unnecearrty files

* address review comments

* ut fix

* revert localsite_test.go

* change special suffix to teleport-github-org for routing

* fix routing ut

* minor typo edit

* fix ut after sshca change

* add UT to sshutils

* minor review comments

* fix api ut because of special suffix change

* GitServerReadOnlyClient

* downgrade error to warning

* run go mod tidy. not sure why it's needed

* rename mock.go to mock_test.go
2025-01-14 21:48:04 +00:00
rosstimothy ef859498bc Vendor gravitational/trace/trail in api (#51032)
* Vendor gravitational/trace/trail in api

Pulling in the trail package directly in api will allow the trace
module to shed the grpc-go dependency. This needs to land prior
to https://github.com/gravitational/trace/pull/112 being included
in a new version of trace.

There should be no noticable change in the api depdency tree since
it already depends on grpc-go. Some additional items from the
trace/internal package were also vendored within trail as needed.
Additionally, some of the public api of trail that was not being
consumed has been made private.

* fix: appease linters
2025-01-14 21:04:01 +00:00
rosstimothy 17edb10e43 Permit routing to agentless nodes with non-UUID metadata.name (#50915)
We suggest that a UUID is used for agentless nodes metadata.name
field, but we do not enforce it. This causes several edge cases
and slightly weird UX in places that expect the name to be a UUID.
Most notably, this presents dialing problems for the web ui as
described in https://github.com/gravitational/teleport/issues/50914.
To allowing dialing to function in all cases for these servers,
routing has been updated to permit matches on metadata.name, however,
the match is given a lower score then a match on a UUID. This should
permit dialing, though, it may still result in ambiguity.

Closes #50914.
2025-01-09 20:35:14 +00:00
rosstimothy c61461b4fd Improve client tools host resolution (#50175)
Host resolution performed because labels, fuzzy search, or predicate
expressions were supplied to commands that establish connections to
a single host has historically been performed client side in tsh.
While that works in most cases, it can prevent correctly
resolving hosts in some situations, i.e. when there are ambiguous
hosts and tsh is unaware that the cluster routing strategy is set
to ROUTE_TO_MOST_RECENT.

To improve the experience, a new ResolveSSHTarget was added to
Auth to allow host resolution to be performed server side. The
resolution works in a similar manner to, and was inspired by
GetSSHTargets. In the event that the new RPC is not implemented,
because the client is newer than Auth, tsh has also been updated
to pull the cluster networking config and address any host
ambiguity if allowed.

As a result tsh scp and tsh proxy ssh should be much more
tolerant to, and still permit access in situations where
ambiguous hosts are present for some amount of time. Prior to
this the only way to connect in these situations was to find
the UUID of the correct target instance and try again after
seeing an ambiguous host error.
2024-12-20 15:57:26 +00:00
rosstimothy 04d8ca10ad Remove unused logrus.Entry from proxy.Router (#50309) 2024-12-17 17:08:39 +00:00
Edoardo Spadolini ae023820b7 Disable peer/quic.TestBasicFunctionality for now (#50106) 2024-12-12 13:10:01 +00:00
Edoardo Spadolini bcbfa8192e Get rid of math/rand in favor of math/rand/v2 (#49294)
* Get rid of math/rand in favor of math/rand/v2

* Update retryutils to use rand.N

* Update e ref
2024-11-21 12:57:32 +00:00
Edoardo Spadolini 021d2a0a3f Fix lib/proxy/peer/quic for 32-bit builds (#49044) 2024-11-15 15:27:53 +00:00
Edoardo Spadolini bb5e64b44f QUIC proxy peering (#47587)
* Docs, utilities and protobuf definitions

* Server implementation

* Client implementation

* Tests

* Log the correct handshake error

* Use constants for stream and application error codes

* Avoid stuttering in const names

* Improve godocs and explanations

* Address test review comments
2024-11-14 18:40:37 +00:00
Edoardo Spadolini 0f3d691a79 Periodically check connectivity between peer proxies (#48838)
* Add ping RPC to grpc proxy peering

* Periodically check connectivity between peer proxies

* Replace deprecated jitter functions
2024-11-13 17:46:14 +00:00
Edoardo SpadoliniandAlan Parra 5c2bbfd6b7 Preparation for the QUIC proxy peering implementation (#48836)
* Move the QUIC proxy peering envvar check to lib/config

* Move lib/proxy/clusterdial to lib/peer/dial

* Move peer.clientConn to lib/proxy/peer/internal

* Require QUIC peering label to be set to "yes"

* Move peer TLS verification funcs to lib/proxy/peer/internal

* Move QUICServer to lib/proxy/peer/quic

* Avoid stuttering in lib/proxy/peer/quic

* Remove useless quic.ServerConfig.CipherSuites param

* Fix log style in proxy.peer.quic

* Move duplicatePeerMsg into the function scope

Co-authored-by: Alan Parra <alan.parra@goteleport.com>

---------

Co-authored-by: Alan Parra <alan.parra@goteleport.com>
2024-11-13 16:06:01 +00:00
Zac Bergquist c7765fa7f1 Fix incorrect usages of "it's" (#48252) 2024-10-31 23:35:30 +00:00
rosstimothy 24e8b68f3a Generalize resource watchers (#47561)
Consolidate resource watchers into a single watcher that leverages
generics. While most of the resource watchers were similar, some
resources have some one off functionality. These watchers have not
been touched, however, all that could be refactored to use the
generic watcher easily were.
2024-10-28 18:49:57 +00:00
Nic Klaassen 0a0d4137db eliminate rsa.GenerateKey and lib/auth/native (#47768) 2024-10-21 20:55:22 +00:00
Edoardo Spadolini 3e75921c8a Convert lib/proxy/peer to slog (#47649)
* Convert lib/proxy/peer to slog

* .

* style compliance with RFD 0154
2024-10-17 12:55:00 +00:00
rosstimothy 0f02047d2e Convert resource watchers to use slog (#47560)
The logrus logger was left in place for now and will be removed
once teleport.e has been converted.
2024-10-15 15:42:25 +00:00
Nic Klaassen 235b348aad update key algorithm for agentless dials (#47241)
* update key algorithm for agentless

* fix tests
2024-10-08 19:44:15 +00:00
Edoardo Spadolini 9cd659e1aa Scaffolding for QUIC proxy peering (#47216)
* Simplify peer server TLS

* Make the peer clientConn generic

* Mock implementation of QUIC proxy peering

* Convert the peer server to slog

* QUICServer docs

* go mod tidy
2024-10-07 15:24:32 +00:00
Nic Klaassen c15825c751 use configured algorithms for dynamic SSH host certs (#46329)
* dynamic SSH host certs use configurable algorithms

* lazily PrecomputeKeys everywhere

* slightly speed up TestTSHConfigConnectWithOpenSSHClient
2024-09-11 19:21:50 +00:00
Edoardo Spadolini 7cb9cbad5a Derive dynamic cryptographic configurations from *service.Connector (#43937)
* Derive dynamic cryptographic configurations from *service.Connector

* Clean up unused code

* Added missing godocs

* fix TextProxyGRPCServers
2024-07-25 07:33:01 +00:00
Forrest c653a844f1 add ability to disable unqualified hostname lookups (#42952) 2024-06-20 20:20:16 +00:00
rosstimothy 7fe7a6b2a0 Replace dependencies on lib/auth with lib/authclient (#41623)
* Remove authclient.Client/ClientI/NewClient aliases in lib/auth

* Remove WebSessionReq aliases in lib/auth

* Remove GithubAuthResponse aliases in lib/auth

* Remove GithubAuthRequest aliases in lib/auth

* Remove KubeCSR alias in lib/auth

* Remove KubeCSRResponse alias in lib/auth

* Remove OIDCAuthResponse alias in lib/auth

* Remove OIDCAuthRequest alias in lib/auth

* Remove ValidateOIDCAuthCallbackReq alias in lib/auth

* Remove OIDCAuthRawResponse alias in lib/auth

* Remove CreateUserTokenRequest alias in lib/auth

* Remove SAMLAuthResponse alias in lib/auth

* Remove SAMLAuthRequest alias in lib/auth

* Remove ValidateSAMLResponseReq alias in lib/auth

* Remove SAMLAuthRawResponse alias in lib/auth

* Remove ValidateTrustedClusterRequest alias in lib/auth

* Remove ValidateTrustedClusterRequestRaw alias in lib/auth

* Remove ValidateTrustedClusterResponse alias in lib/auth

* Remove ValidateTrustedClusterResponseRaw alias in lib/auth

* Remove AuthenticateUserRequest alias in lib/auth

* Remove ForwardedClientMetadata alias in lib/auth

* Remove PassCreds alias in lib/auth

* Remove OTPCreds alias in lib/auth

* Remove SessionCreds alias in lib/auth

* Remove AuthenticateSSHRequest alias in lib/auth

* Remove SSHLoginResponse alias in lib/auth

* Remove TrustedCerts alias in lib/auth

* Remove AuthoritiesToTrustedCerts alias in lib/auth

* Move auth.HostFQDN to authclient

* Move auth.WithClusterCAs, auth.DefaultClientCertPool and auth.ClientCertPool to authclient

* Switch alpn proxy to use authclient.CAGetter instead of auth.ReadProxyAccessPoint

* Use a smaller scoped interfaces in lib/proxy/peer to remove lib/auth dependency

* Move auth.TryCreateAppSessionForClientCertV15 to authclient

* Move auth.ErrNoMFADevices to authclient

* Move access point interfaces to authclient. Aliases left behind to prevent breaking builds

* remove lib/auth dependency from lib/reversetunnelclient

* fix lints

* fix license

* Bump e ref to include gravitational/teleport.e#4174

* Use authclient.Client in new tctl diag commands

* Stop using auth.UserTokenType aliases
2024-05-16 17:34:58 +00:00
rosstimothy e95f3d3ed5 Start using authclient.Client/ClientI/NewClient (#41539)
Consumes the new auth client created in #41460. The changes introduced
were performed with a series of gofmt rewrite rules.

```bash
$ find ./lib/auth -type f -name '*.go' -exec gofmt -w -l -r "ClientI -> authclient.ClientI" {} \;
$ find ./lib/auth -type f -name '*.go' -exec gofmt -w -l -r "Client -> authclient.Client" {} \;
$ find ./lib/auth -type f -name '*.go' -exec gofmt -w -l -r "NewClient -> authclient.NewClientI" {} \;
$ find . -type f -name '*.go' -exec gofmt -w -l -r "auth.ClientI -> authclient.ClientI" {} \;
$ find . -type f -name '*.go' -exec gofmt -w -l -r "auth.Client -> authclient.Client" {} \;
$ find . -type f -name '*.go' -exec gofmt -w -l -r "auth.NewClient -> authclient.NewClient" {} \;
```
2024-05-15 14:09:14 +00:00