Commit Graph
699 Commits
Author SHA1 Message Date
Alan Parra e5966d8f0a chore: Bump google.golang.org/protobuf to v1.36.2 (#50841)
* chore: Bump google.golang.org/protobuf to v1.36.2

* Tidy modules

* Update generated protos
2025-01-08 13:50:45 +00:00
Alan Parra d070ce0ec3 chore: Bump google.golang.org/protobuf to v1.36.1 (#50540)
* chore: Bump google.golang.org/protobuf to v1.36.1

* Update generated protos
2024-12-23 15:17:42 +00:00
Bernard Kim a221604dc5 Add UpsertTrustedClusterV2 RPC (#49789)
* Add UpsertTrustedClusterV2 rpc

This supersedes UpsertTrustedCluster rpc. V2 performs resource name
validation.

* Replace confusing UpsertValidationTrustedCluster name

* Use UpsertTrustedClusterV2 in tests

* Address feedback

- Remove unnecessary ping
- Update error messages
- Use skipNameValidation consts
- Validate cluster name before establishing trust
- Do not reveal cluster name in error message
- Use BadParameter instead of CompareFailed

* Use webclient.Find

* Fix test/lint

* Allow label updates

* Fix test

* Fix error handling

* Implement CreateTrustedClusterV2 and UpdateTrustedClusterV2

* Address feedback

* Minor fixes

* Move V2 RPCs to the trust service

* Update comment

* Drop V2 suffix

* Require matching revision

* Fix upsert/update revision

* Drop V2 from Create and Update APIs

* Lint: Fix typo
2024-12-21 04:24:29 +00:00
Noah Stride 3796023d01 Add support for WorkloadIdentity resource to the Teleport Terraform Provider (#50382)
* First pass at trying to generate terraform provider

* Wire up types

* Fix generation of docs

* Add godoc comments

* Add tests

* Tflint and add example
2024-12-20 18:37:20 +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
Alan Parra 0aaca3fcce Add the decisionv1.Service boilerplate (#49912)
* Add the decisionv1.Service boilerplate

* Wire decisionv1.Service to auth.GRPCServer

* Wire decisionpb.DecisionServiceClient to client.Client

* Add basic service testing
2024-12-17 14:13:16 +00:00
Alan Parra 79e993b52b chore: Bump google.golang.org/protobuf to v1.36.0 (#50288)
* chore: Bump google.golang.org/protobuf to v1.36.0

* Update generated protos
2024-12-16 19:17:25 +00:00
STeve (Xin) Huang 80a58fc82c GitHub proxy part 5: OAuth flow to retrieve GitHub identity (#49849)
* GitHub proxy part 5: OAuth flow to retrieve GitHub identity

* review comments round1

* review comments round 2 and update tsh git list

* make -C integrations/operator crd

* make -C integrations/terraform docs

* fix flaky test
2024-12-10 17:31:32 +00:00
Noah Stride 35e934c1db Add basic tctl commands for WorkloadIdentity resource kind (#49828)
* Add basic tctl commands for WorkloadIdentity resource kind

* Add `tctl workload-identity ls`

* Add `tctl workload-identity ls`

* Fix message strings to be consistent

* Add tests for `tctl workload-identity` functionality
2024-12-10 17:19:05 +00:00
Trent Clarke 10925bbaae Add Identity Center Account Assignments to Unified Resource Cache (#49580)
Adds Identity Center Account Assignments to the Unified resource cache
so they can be requested in access requests.

Unfortunately we can't just include an `identitycenterv1.AccountAssignment`
directly in the resource cache ListResources output because the legacy
protobuf codegen used for the authservice and the new codegen used for
identitycenter/v1 produce incompatible serialization code, so resulting
generated code does not compile.

To get around this issue, this change introduces a parallel (and slightly
simplified) definition of an IdentityCenterAccountAssignment in the authservice
protobuf spec to act as the wire format for this type. The cached
`identitycenterv1.AccountAssignment` resources are copied into a
`proto.IdentityCenterAccountAssignment` on a cache read.

Includes:
 - adding resources to cache
 - adding account assignment paginated resource
 - account assignment role condition matching for RBAC
2024-12-09 12:02:36 +00:00
Noah Stride 7a3fce975a Workload ID: Add Protos for WorkloadIdentity resource, CRUD and events (#49650)
* Add protos for resource and resource svc

* Add field for encoding the created/updated workloadidentity in audit
events

* Remove redundant package qualifier

* Add UpsertWorkloadIdentity

* Appease linter

* Add TrimToMaxSize implementation
2024-12-06 11:42:44 +00:00
Hugo ShakaandStephen Levine a33473dde9 Make the proxy read from autoupdate_agent_rollout (#49380)
* Add autoupdate_agenbt_rollout support

* fix ping proxy tests

* address creack's feedback

* Address sclevine's feedback

Co-authored-by: Stephen Levine <stephen.levine@goteleport.com>

* fix panic in tests

---------

Co-authored-by: Stephen Levine <stephen.levine@goteleport.com>
2024-12-05 22:21:07 +00:00
STeve (Xin) Huang 8f50cf15e8 GitHub proxy part 4: tsh git ls with unified resource (#49596)
* GitHub proxy part 4: tsh git ls

* fix ut

* update username note

* fix
2024-12-05 17:40:03 +00:00
Trent Clarke e1be633ac0 Exposes Identity Center accounts as Apps in Unified Resource Cache (#49301)
* Exposes Identity Center accounts as Apps in Unified Resource Cache

    For the purposes of the UI, Identity Center accounts and account
    assignments are treated like special Apps. This patch exposes
    Account Assignments to the UI via the Unified Resource Cache.

    Includes:
    - Generating an App resource from an Identity Center Account resource
    - General plumbing from backend through to cache and UI

* lint
2024-12-05 12:23:56 +00:00
STeve (Xin) Huang c4d0dc4f00 GitHub proxy part 2.5: git_server cache (#49564)
* GitHub proxy part 2.5: git_server cache

* revert event

* fix getAll

* review comments
2024-12-05 03:18:50 +00:00
STeve (Xin) Huang 903fee053f GitHub Proxy part 3: gen github user cert and export CA (#49396)
* GitHub Proxy part 3: gen github user cert and export CA

* address pr comment

* minor refactor

* use cache

* fix build and cache
2024-12-03 18:17:21 +00:00
STeve (Xin) Huang b5a6c679fe GitHub Proxy part 3.5: caching PluginStaticCredentials (#49472)
* GitHub Proxy part 3.5: caching PluginStaticCredentials

* fix lint
2024-12-03 15:32:00 +00:00
Alan Parra 3cf8f2ac33 chore: Bump google.golang.org/protobuf to v1.35.2 (#49694)
* chore: Bump api/ Go modules

* Tidy dependent modules

* chore: Bump google.golang.org/protobuf to v1.35.2

* Update generated protos
2024-12-03 15:09:47 +00:00
Rafał Cieślak 0ade3a8f58 Add TargetPort to RouteToApp & use it to route connections to multi-port TCP apps (#49047)
* Add TargetPort to RouteToApp and AppMetadata proto messages

* Pass TargetPort during cert generation

* Refactor Pack.makeTLSConfig to accept struct

This will make it easier to add targetPort to it.

* Add labels to UUIDs used by appaccess test pack app servers

This makes them easier to distinguish when routing doesn't work as expected.

* Refactor Pack.CreateAppSession to accept a struct

* TestTCP: Create app session within test

If we kept the old code, we'd need to manually create a session for each
target port, which would create a lot of duplication.

* Prepare integration test fixtures for multi-port tests

* Add api/utils/net.IsPortInRange

* Use TargetPort when routing TCP connections

* Inline dialMultiPortTCPApp, centralize logic

* Check target port when connecting to single-port app

* Reorder check in IsPortInRange

* Use int instead of uint16

* Extract picking dialTarget to separate function

* addr → uriAddr

* Improve err msg for single-port apps when targetPort != uriPort

* Fix unnecessary conversion to int
2024-12-03 13:55:00 +00:00
Alan Parra 90076ba5e0 Fix TestDynamicIdentityFileCreds for Go 1.23 (#49597) 2024-12-02 14:14:47 +00:00
Vadym Popov af6a6ea734 Add monitoring of the servers time drifting (#44489)
* Add monitoring of the servers time drifting

* Refactor monitor to use inventory stream

* Add command for inventory control stream for time reconciliation

* Reuse ping/pong logic for time reconciliation

* Add integration test to check if global notification is created

* Limits notification length, renaming

* Return system clock instead of time difference
Add parallel requests to ping the nodes
Fix issue with locking inventory store while making ping request

* Refactor to make time reconciliation part of the inventory control stream

* Fix tests

* Rewrite tests
Return inventory store iterator

* Naming adjustments

* Fix test

* Drop timeReconciliation in order to use direct handler functions

* Make time reconciliation with variable duration

* Replace with duration type in proto
Add test cleanup for possible goroutine leak
Add comment about half request duration

* Format notification message

* Add UpstreamInventoryPong.SystemClock check
2024-11-28 21:18:24 +00:00
STeve (Xin) Huang fae535b3df GitHub Proxy part 2: git_server resource, service, and RBAC (#49393)
* git_server resource and role.allow.github_permissions

* implicit RO on KindGitServer

* review comments

* fix ut

* make -C integrations/operator crd

* fix ut again

* make crds-up-to-date and make -C integrations/terraform docs
2024-11-27 16:12:30 +00:00
Hugo Shaka 7d102ca45c introduce webclient.ReusableClient (#49296) 2024-11-27 15:22:22 +00:00
Edoardo Spadolini e4378bef23 Preparation for variable rate heartbeats (#49433)
* Revert "Add unstable envvar to disable server keepalives (#43342)"

This reverts commit 1e2d7724e7.

* Allow changing a VariableDuration by more than one

* Get rid of control log pings

* Dedicated lightweight jittered ticker for the inventory

* Split off per-protocol tickers

* Tests for jittered ticker

* Use a start barrier in TestVariableDurationIncDec

* Explain value to be passed to Advance

* Add explanations in jitteredticker tests

* Rename jitteredticker to delay
2024-11-27 10:43:07 +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
Brian Joerger 169128dc17 feat: SSO MFA - Moderated Sessions (#48646)
* Add sso client redirect url to maintain session rpc.

* Handle sso client redirect URL in maintain session presence RPC.

* Add client implementation of SSO MFA for moderated sessions.

* Cleanup.
2024-11-12 20:08:50 +00:00
Sakshyam Shah 3757080c6d feat: identity center and provisioning service gRPC client with deleteAllxxx methods (#48714)
* feat: identity center and provisioning service gRPC client with deleteAllxxx methods

* DeleteAllPermissionSets

* run make fix-imports
2024-11-12 16:57:47 +00:00
Brian Joerger 313acfa181 feat: SSO MFA - WebUI backend implementation (#47832)
* Add SSO MFA ceremony support to WebUI per-session MFA.

* Add display name to SSO MFA device; Add SSO MFA device to SSO challenge.

* Camel case json tags for front end.

* Add sso channel ID for front end broadcast channel logic.

* Fix backwards compatiblity issue; fix error message.

* Fix test.

* Fallback to connector id if display name isn't set.

* Fix test.

* Resolve comment.

* Use uuid.NewRandom.

* go mod tidy
2024-11-06 01:43:41 +00:00
Brian Joerger 0927b6f768 Teleport Connect allow SSO hostname (#48035)
* Add SSO provider URLs to ping response.

* Add SSOHostname to profile.

* Add SSOHostname to teleterm cluster.

* Add SSO hostname to connect's proxy host allow list.

* Fix lint.

* Address comments.

* Document use of SSOHostname in the profile.

* Use sso host, not hostname.

* Ping with connector.

* Resolve comments.
2024-11-05 18:43:20 +00:00
Alex McGrathandMaxim Dietz fa97b8f90d feat: Allow including Access Lists as nested members and owners (#38738)
- Recursively check for accesslist membership

- Allow adding/removing/listing included access lists in acl commands

- Add a recursive test

- Use dynamic access lists structure from RFD

- Resolve proto changes

- Exclude 'list' members from Access List memberCount

- Calc Access List member count with members of type 'list' excluded,
  return seperately to front end

- Update examples/integrations

- Update crd docs

- Update tf docs

- Perform calculation of inherited roles/traits to AccessList service in
  order to utilize cache and minimize number of requests.

- Grant Okta integration RO for Access Lists

- Update AccessListMember-* events

- Include count for inherited grants

- Include MembershipKind of affected member(s)

- Emit inherited grants / members' MembershipKind for AccessListMember-*
  events

- Update notified owners for Access Requests

- Ensure dynamic owners are notified for Access Requests

- Ensure dynamic owners are notified via Slack integration

- Optionally pass an AbortSignal to `fetchAccessLists` in Web UI

- Replace usages of `services.IsAccessListOwner/IsAccessListMember` with
  equivelant funcs from `Hierarchy`

- Remove final references to AccessListMembershipChecker

- Don't allow ACL deletion when member/owner in other lists

- Guard Access List deletion behind membership/ownership checks for List

- Expose Hierarchy func to recursively get all members

- Tidy UserLoginStateGenerator logic involving ACL Membership/Ownership

Co-authored-by: Maxim Dietz <maxim.dietz@goteleport.com>
2024-11-01 22:07:36 +00:00
Vadym Popov 9d2b5c5fe9 Client auto updates integration for {tctl,tsh} (#47815)
* Client auto updates integration for tctl/tsh

* Add version validation
Fix recursive version check for darwin platform
Fix cleanup for multi-package support

* Fix identifying tools removal from home directory

* Replace ToolsMode with ToolsAutoUpdate

* Reuse insecure flag for tests

* Fix CheckRemote with login

* Fix windows administrative access requirement
Update must be able to be canceled, re-execute with latest version or last updated
Show progress bar before request is made

* Fix update cancellation for login action
Address review comments

* Add signal handler with stack context cancellation

* Use copy instead of hard link for windows
Fix progress bar if we can't receive size of package

* Replace with list in order to support manual cancel

* Download archive package to temp directory

* Decrease timeout for client tools proxy call
2024-10-31 17:09:24 +00:00
Michelle Bergquist 6e1189da89 Use cloud anonymization key (#46819)
- When present, is used to anonymize events
2024-10-30 03:11:23 +00:00
Przemko RobakowskiandZac Bergquist dddd9ea5a2 Fix update and list for DynamicWindowsDesktops (#48046)
* proto

* Fix update for DynamicWindowsDesktops

* fix test server

* fix test

* fix test

* fix test

* Update api/proto/teleport/dynamicwindows/v1/dynamicwindows_service.proto

Co-authored-by: Zac Bergquist <zac.bergquist@goteleport.com>

* update proto

* fix tests

---------

Co-authored-by: Zac Bergquist <zac.bergquist@goteleport.com>
2024-10-29 22:18:27 +00:00
Brian JoergerandAlan Parra 5e7bdb2a15 feat: SSO MFA - Add SSO MFA ceremony (#46982)
* Add SSOMFACeremony to MFA prompt; Add SSOMFACeremonyConstructor to MFA ceremony.

* Set SSO MFA ceremony from client configuration.

* Close sso mfa redirector once mfa ceremony is complete.

* Refactor sso mfa ceremony.

* Add SSOMFACeremonyConstructor.

* Add tests.

* Add --mfa-mode=sso support; Add cli prompt UX changes.

* Remove unused field, fix test.

* Resolve comments.

* Remove convoluted context closing logic for sso redirector.

* Fix test.

* Update lib/client/sso/ceremony.go

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

---------

Co-authored-by: Alan Parra <alan.parra@goteleport.com>
2024-10-29 21:23:46 +00:00
Stephen Levine 3220ffad77 [teleport-update] Use new webapi fields to find version (#47961)
* Adapt teleport-update to new webapi endpoints

* feedback
2024-10-29 19:03:31 +00:00
Hugo Shaka 1807dfdf52 Implement immediate schedule support for automatic updates (#47920)
* Implement immediate schedule support

* expose edition, fips, and ensure ping endpoint answers

* fix after rebase

* fix cache tests
2024-10-29 15:11:29 +00:00
Zac Bergquist 6d205ba0c8 Remove the original unpaginated GetRoles RPC (#47984)
This was replaced with ListRoles, which implements pagination.
2024-10-28 14:31:57 +00:00
Trent Clarke 54c9060e75 Adds caching support for Identity Center resources (#47880)
* Adds caching support for Identity Center resources

Adds support for caching (and watching) some IdentityCenter resource types.

Specifically:
 - identitycenterv1.Account
 - identitycenterv1.AccountAsssignment
 - identitycenterv1.PrincipalAssignment

Also breaks the cache's `genericcollection` out into its own file as an attempt
to reduce clutter in the main collections source file.

* Update identitycenter_events.go

* Update identitycenter_events.go

* Speed up tests
2024-10-28 12:20:14 +00:00
Brian Joerger 4cd3f3bb9c feat: SSO MFA - SSO MFA challenge creation and verification (#47684)
* Update e ref.

* Update proto.

* Handle SSO MFA challenge creation.

* Handle SSO MFA challenge response validation.

* Only create SSO MFA challenge if SSO MFA is an enabled second factor; Require SSO MFA for device registration when available.

* Update verification logic; Add test.

* Fix lint.
2024-10-24 20:12:59 +00:00
Hugo Shaka fbbcb5fe39 Add AutoUpdateAgentRollout service and cache (#47833) 2024-10-24 12:08:07 +00:00
Noah Stride bad3497d70 Convert RegisterUsingToken RPC from HTTP to gRPC (#47853)
* Add proto changews for shifting RegisterUsingToken to gRPC

* Implement RegisterUsingToken RPC and client fallback

* Add methods to `api/client`

* Adjust join/register code to try new API first and fallback to old

* Rejig JoinServerGRPCServer to invoke auth.Server

* Tidy up some code duplication

* Fix broken build

* Fix TestRegisterBot_RemoteAddr

* Fix TestServer_RegisterUsingTPMMethod

* Add test for new RegisterUsingToken gRPC RPC

* Remove unused helper function

* Fix test

* Walk back switch to gRPC endpoint for registration via proxy

* Remove unused code
2024-10-24 10:54:22 +00:00
Przemko Robakowskiandrosstimothy f651ab19cd Create WindowsDesktops for matching DynamicWindowsDesktops (#46991)
* Add DynamicWindowsDesktop to proto

* Add resource matchers to Windows desktop service config

* Implement API and backend for DynamicWindowsDesktop

* Cache and watcher support for DynamicWindowsDesktop

* Create WindowsDesktops for matching DynamicWindowsDesktops

* Fix imports

* fix test

* lint

* review comments

* move rpc to separate server

* rework api and grpc more towards 153-style

* e

* remove dynamic windows from paginated resource

* add tests

* add tests

* Update api/proto/teleport/legacy/types/types.proto

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

* lint

* gci

* cleanup

* cleanup

* use generic service

* cleanup

* cleanup

* cleanup

* cleanup

* cleanup

* gci

* rework cache

* rework cache

* add admin action checks

* move service

* add service test

* gci

* update discovery

* add discovery test

* review comments

* review comments

* review comments

* update interfaces

* gci

* gci

* review comments

* review comments

* fix loggers

* fix tctl

---------

Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>
2024-10-23 20:33:58 +00:00
Przemko Robakowskiandrosstimothy ee09328cc4 Cache and watcher support for DynamicWindowsDesktop (#46989)
* Add DynamicWindowsDesktop to proto

* Add resource matchers to Windows desktop service config

* Implement API and backend for DynamicWindowsDesktop

* Cache and watcher support for DynamicWindowsDesktop

* Fix imports

* fix test

* move rpc to separate server

* rework api and grpc more towards 153-style

* e

* remove dynamic windows from paginated resource

* add tests

* add tests

* Update api/proto/teleport/legacy/types/types.proto

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

* lint

* gci

* cleanup

* cleanup

* use generic service

* cleanup

* cleanup

* cleanup

* cleanup

* cleanup

* gci

* rework cache

* rework cache

* add admin action checks

* move service

* add service test

* gci

* review comments

* review comments

* review comments

* update interfaces

* gci

* review comments

* review comments

* fix loggers

---------

Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>
2024-10-22 21:22:03 +00:00
Przemko Robakowskiandrosstimothy 0f487f6bbc Implement API and backend for DynamicWindowsDesktop (#46987)
* Add DynamicWindowsDesktop to proto

* Add resource matchers to Windows desktop service config

* Implement API and backend for DynamicWindowsDesktop

* Fix imports

* move rpc to separate server

* rework api and grpc more towards 153-style

* e

* remove dynamic windows from paginated resource

* add tests

* add tests

* Update api/proto/teleport/legacy/types/types.proto

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

* lint

* gci

* cleanup

* cleanup

* use generic service

* cleanup

* cleanup

* cleanup

* cleanup

* cleanup

* gci

* add admin action checks

* move service

* add service test

* gci

* review comments

* review comments

* review comments

* review comments

* review comments

---------

Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>
2024-10-22 20:12:34 +00:00
Nic Klaassen 93a548c6af resolve minor TODOs (#47777)
* resolve minor TODOs

* fix terraform docs
2024-10-22 17:46:00 +00:00
Nic Klaassen 0a0d4137db eliminate rsa.GenerateKey and lib/auth/native (#47768) 2024-10-21 20:55:22 +00:00
Hugo Shakaandrosstimothy 1348d81fd4 Add autoupdate agent protos (#47666)
* Add autoupdate agent protos

* fix tests

* Add create/update/delete RPCs + add missing event proto

* Update api/proto/teleport/autoupdate/v1/autoupdate.proto

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

* address timr's feedback + fix tests

* buf lint

* buf lint pt.2

---------

Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>
2024-10-21 20:18:25 +00:00
Vadym Popov 10fb784495 Client AutoUpdate proto structure changes (#47532)
* Update client autoupdate proto structure

* Replace with reserved

* Fix unit tests

* Add more info in proto

* Rename proto to be aligned RFD namings

* Replace enum type for ToolsMode to string
2024-10-17 14:36:06 +00:00
Hugo Shaka 935a2aa560 Remove autoupdate_agent_plan (#47629) 2024-10-16 18:06:30 +00:00
Grzegorz Zdunekandjoerger bd6fdbf2c1 Cache PIV connections to share across the program execution (#47091)
* Cache yubikey objects.

* Cache PIV connections to share across the program execution.

* Do not release the connection until `sign` returns

* Do not ignore errors

* Perform a "warm up" call to YubiKey

* Fix tests

* Use a specific interface to check if the key can be "warmed up"

* Allow abandoning `signer.Sign` call when context is canceled

* Make sure that the cached key is valid for the given private key policy

The reason for adding this check was failing `invalid key policies` test.

* Make `hardwareKeyWarmer` private

* Force callers to release connection

* Improve comments

* Fix lint

* Improve `connect` comment

* Fix race condition

* Simplify `release` logic

* Trigger license/cla

---------

Co-authored-by: joerger <bjoerger@goteleport.com>
2024-10-16 08:02:17 +00:00