Commit Graph
557 Commits
Author SHA1 Message Date
9062d62aff Add access monitoring rules cache and tctl interactions (#40218)
* Add access monitoring rules cache and tctl interactions

* Swap access monitoring rules collections to use upsert

* Update accessmonitoringrules cache test

* Readd missing err check

* Update lib/auth/grpcserver.go

Co-authored-by: Marco André Dinis <marco.dinis@goteleport.com>

* Update lib/auth/grpcserver.go

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

* Update tool/tctl/common/resource_command.go

Co-authored-by: Marco André Dinis <marco.dinis@goteleport.com>

* Add tctl isForced behaviour for access monitoring rules

* Add missing methods to cache interface for access monitoring rules

* Add info messages to tctl commands for accessmonitoring rule edits

* Add missing user message for forced rule creation

* Appease linter

---------

Co-authored-by: Marco André Dinis <marco.dinis@goteleport.com>
Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>
2024-04-17 13:05:01 +00:00
Tiago Silva 502879a5fe DiscoveryConfig: Update status after each run (#40267)
* DiscoveryConfig: Update status after each run

Signed-off-by: Tiago Silva <tiago.silva@goteleport.com>

* add unit tests

* drop method by reducing interface area

---------

Signed-off-by: Tiago Silva <tiago.silva@goteleport.com>
2024-04-10 17:18:58 +00:00
rosstimothy 33d47c041e Correctly propagate windows desktop logins in GetUnifiedResourcePage (#40359)
The conversion from a proto.PaginatedResource to a types.EnrichedResource
inadvertently omitted setting logins for windows desktops. A new
test, TestGetUnifiedResourcesWithLogins, was added to validate that
if logins are provided by the server that they are passed along in
the enriched resource.

Closes #40340
2024-04-09 16:26:15 +00:00
rosstimothy ad26913c71 Load appropriate TLS config for clusters (#40293)
Updates the proxy.Client to allow loading specific tls.Config for
individual clusters. This prevents issues when trying to access
leaf resources via the root cluster if WithAllCAs is not set.
2024-04-09 16:02:28 +00:00
Noah Stride 0590d724c5 Add Protos for TPM Joining (#40307)
* Add protos for TPM joining

* Add `*proto.UnimplementedJoinServiceServer` to `JoinServiceGRPCServer`

* Update CRDs
2024-04-09 12:26:27 +00:00
Krzysztof SkrzętnickiandAnton Miniailo 24021556c4 Implement persistence for database_object resource (#39756)
* Implement persistence for database_object resource

* Split monolithic service test

* Add `t.Parallel()` to the tests

* lint fix

* Update copyright year

Co-authored-by: Anton Miniailo <anton@goteleport.com>

* `make grpc`

---------

Co-authored-by: Anton Miniailo <anton@goteleport.com>
2024-04-03 08:28:11 +00:00
Tiago Silvaandrosstimothy 8681546401 Add conditional update methods for AccessList and AccessListMembers (#40036)
* Add conditional update methods for `AccessList` and `AccessListMembers`

This PR adds two new methods for conditinally update an AccessList and
AccessListMember resources to avoid overriding changed resources.

This is a preparation for a ineligible status reconciler.

Signed-off-by: Tiago Silva <tiago.silva@goteleport.com>

* Update lib/services/simple/access_list.go

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

* handle review comments and drop copy methods

* simplify code

---------

Signed-off-by: Tiago Silva <tiago.silva@goteleport.com>
Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>
2024-04-02 16:52:55 +00:00
Edward Dowlingandrosstimothy 2a08180e99 Add access monitoring rules services and backend (#39143)
* Add access monitoring rules backend

* Add missing service implementations for access monitoring rules

* Add missing struct tags to access monitoring rules

* Simplify toProto and fromProto for access monitoring rules

* Remove simple/access_monitoring_rules

* Use backend service adapter for access monitoring rules service

* Remove unused logger from access monitoring rules service

* Use cache for ListAccessMonitoringRules

* Add tests for access monitoring rules local backend

* Add tests for access monitoring rules service

* Fix import order

* Update lib/services/local/access_monitoring_rules.go

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

* Update lib/services/local/access_monitoring_rules.go

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

* Add checks to validate AccessMonitoringRules

* Update lib/services/access_monitoring_rules.go

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

* Update lib/services/access_monitoring_rules.go

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

* Remove unused deleteAll method from access monitoing rules service

* Update accessMonitoringRules cache interface to be more restrictive

* Update access monitoring rules tests to not deprecated methods

* Appease linter

* Fix import order in access monitoring rules test

* Fix import order in access monitoring rules test

* Remove remaining no generated access monitoring rules definitions

* Remove remaining uses of access monitoring rules conv

* Remove unused imports

* Remove use of removed convert package in tests

* Remove access monitoring rules interface assertion

* Remove unused import

* Fix access monitoring rule service test

* Appease linter

* Appease linter

* Appease linter

---------

Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>
2024-04-02 15:51:17 +00:00
Noah StrideandEdoardo Spadolini 8209d4daea Migrate RemoteClusters CRUD to gRPC (#38671)
* Add protos for PresenceService and RemoteCluster CRUD

* Add service skeleton for presence service

* Add bodies for all methods

* Hook up to new backend methods

* Add presence service to auth grpc server

* Add fallback functions to call old http endpoints

* Fix tests for DeleteAllRemoteClusters

* Remove bad rebase file

* Update proto to remove Create

* Remove unused create grpc handler

* Add Patch support to Update gRPC

* Fix method missing from interface

* Add test for GetRemoteCluster

* Add test for ListRemoteClusters

* Add test for DeleteRemoteCluster

* Add tests for TestUpdateRemoteCluster

* Appease linter

* Fix GetRemoteCluster test

* Update lib/auth/httpfallback.go

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

* Update api/client/client.go

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

* Update lib/auth/httpfallback.go

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

* Fix reference to trace.Component

---------

Co-authored-by: Edoardo Spadolini <edoardo.spadolini@goteleport.com>
2024-04-02 11:24:33 +00:00
Forrest 06ac626868 user filtering (#39844) 2024-04-01 21:19:55 +00:00
Yassine Bounekhla b4531476a7 add notifications to the cache (#39715) 2024-03-30 01:13:15 +00:00
Lisa Kim e5165df49b Return eligible status with UpsertAccessListWithMembers (#40003) 2024-03-29 08:23:49 +00:00
Forrest 9f63987cc6 add filter to ListRoles (#39546)
* impl role filtering

* auth version check
2024-03-26 15:42:03 +00:00
rosstimothy 10da1b3b9e Display available allowed logins for leaf resources in root web ui (#39579)
The Proxy web api now requests that Auth include allowed logins
per resource instead of guessing logins per resource based on the
information it has cached. However, due to the way SSH sessions
are authorized, the logins are not provide to users verbatim.

Any sessions created via the root web ui to a leaf resource will use
the SSH certificate created for that user in the root cluster. New
certificates are not minted per leaf cluster. This is important
because the nodes only allow os logins for a session if they are
present in the valid prinicpals of the SSH certificate. So even
though we are now capabale of displaying all allowed logins for
leaf SSH servers in the root web ui, the user is only able to use
a subset of them. To avoid any odd UX, the Proxy will filter out
any allowed logins which do not exist in the principals of the
root SSH certificate.

The above only holds for SSH, windows desktops are not as strict
and any allowed login from a leaf cluster is now visible in the
root web ui.

Fixes https://github.com/gravitational/teleport/issues/5041
2024-03-25 16:34:51 +00:00
matheusandAlan Parra fad473a236 Add new flags to modules to replace isTeam (#39695)
* Add new flags to modules

* Add deprecated comments to isTeam

* Make support flag an enum

* Add a TODO instead of deprecating flag right away

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

* Add gogoproto.jsontag to new fields

* remove meaning from enum zero value

* Reuse proto.SupportType instead of suping

* Update proto file: rename enum 0 value to unspecified;fix json tag casing

* Reuse proto file instead of aliasing it

---------

Co-authored-by: Alan Parra <alan.parra@goteleport.com>
2024-03-22 17:27:59 +00:00
Brian Joerger 703f8b2c25 Support IsMFARequired for App Access (#39649)
* Add RouteToApp to IsMFARequireRequest.

* Add implementation of IsMFARequiredRequest_App.
2024-03-21 18:55:06 +00:00
Forrest 223a2a8b31 rework ListUsers API (#39626)
* add stream helpers

* rework list users api
2024-03-21 18:29:11 +00:00
Brian Joerger b88251a278 CreateAppSession with MFA (#39650)
* Replace types.CreateAppSessionRequest with proto.CreateAppSessionRequest.

* Add MFA response proto.CreateAppSessionRequest.

* Verify MFA response in CreateAppSession.
2024-03-21 17:18:08 +00:00
Andrew LeFevre 2143f5ba64 add kubernetes waiting container backend service and API (#39317)
* add kubernetes waiting container backend service and API

* remove other resource type

* add unit test

* fix after rebasing

* address feedback

* remove KubeWaitingContainerRequest

* check for nil in validation func

* remove UnwrapResource153

* fix test

* address feedback

* address linter issues

* fix cache watch kind test
2024-03-20 16:03:39 +00:00
Michael c99969e9dc Add scope and sort option to access request filter (#39582) 2024-03-19 22:19:31 +00:00
Tiago Silva 81e7d146bb Add ClusterAccessGraphConfig RPC method (#39559)
This PR adds the protobuf boilerplate code required to expose the
Access Graph config to all agents that require access to it.

The goal is to reduce the ammount of configuration changes required to
expose the Access Graph service connection parameters to all agents that
require it.

Signed-off-by: Tiago Silva <tiago.silva@goteleport.com>
2024-03-19 14:33:32 +00:00
rosstimothy 8f1522bb34 Convert api to use slog instead of logrus (#39255)
THe use of slog now allows logrus to be removed from the api
module entirely.
2024-03-18 21:20:28 +00:00
rosstimothy 9734fcbdbd Convert SetSessionRecordingConfig usages to new Create/Update/Upsert API (#39249)
Migrates callers off the deprecated API and onto the new API so
that SessionRecordingConfig can be protected via optimistic locking
when appropriate.
2024-03-15 19:55:57 +00:00
Marco André Dinis a0068878de AWS OIDC: Accept custom issuers (#38785)
* AWS OIDC: Accept custom issuers

This PR adds a new field into the AWS OIDC fields:
- issuer

This is the issuer that was configured in AWS.
It is used by teleport to set the `issuer/iss` field when generating the
JWT.
This way we'll be able to set a custom issuer.
As an example, we could set this to be a public S3 bucket which doesn't
suffer from the thumbprint validation issuer.

* ensure issuer is a valid https url

* use s3 uri instead of any url for issuer

* typo and require s3 fields

* add missing s3 location when creating integration

* improve error messages
2024-03-15 18:08:35 +00:00
Trent Clarke 34eb403527 Changes supporting SCIM group/AccessList management in Enterprise (#39331)
* Changes supporting SCIM groups in Enterprise

 - Adds `services.IsEqual` implementatio to AccessListMember for
   easier reconciliation
 - Adds `Delete` support into internal SCIM interfaces

Changelog: None

* linter appeasement
2024-03-15 05:00:45 +00:00
rosstimothy 20888bf130 Convert SetAuthPreferences usages to new Create/Update/Upsert API (#38895)
Migrates callers off the deprecated API and onto the new API so that
AuthPreferences can be protected via optimistic locking when appropriate.
2024-03-14 22:05:20 +00:00
Andrew LeFevre e551bde5da add protobuf definitions for kubernetes waiting container messages (#39316) 2024-03-14 17:46:42 +00:00
rosstimothy bea120ac96 Convert SetClusterNetworkingConfig usages to new Create/Update/Upsert API (#39219)
Migrates callers off the deprecated API and onto the new API so that
ClusterNetworkingConfig can be protected via optimistic locking when
appropriate.
2024-03-14 14:37:42 +00:00
rosstimothy deeadc4b4c Enrich resources with additional metadata (#38827)
Updates ListResources and ListUnifiedResources to optionally allow
responses to include the allowed logins per returned resource that
requesting user has access to given there roles. Logins are only
currently populated for SSH and WindowsDesktop resources. The new
types.EnrichedResource was added to facilitate transporting the
underlying resource and the additional user specific information to consumers.
2024-03-14 00:45:31 +00:00
2552a7b500 Add initial access monitoring rule resource (#36745)
* Add access monitoring rule resource

* Fix linting and simplify access monitoring rules fromProto

* Simplify acces monitoring rules toProto

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

Co-authored-by: Roman Tkachenko <roman@goteleport.com>

* Update api/types/accessmonitoringrule/access_monitoring_rule.go

Co-authored-by: Roman Tkachenko <roman@goteleport.com>

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

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

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

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

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

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

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules_service.proto

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

* Rename AccessMonitoringRuleV1 to AccessMonitoringRule

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

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

* Remove unused to and from proto funcs for access monitoring rules

* Regen from protos

* Remove unused access monitoring rule expiration

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

Co-authored-by: Marek Smoliński <marek@goteleport.com>

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules_service.proto

Co-authored-by: Marek Smoliński <marek@goteleport.com>

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

Co-authored-by: Marek Smoliński <marek@goteleport.com>

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

Co-authored-by: Marek Smoliński <marek@goteleport.com>

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

Co-authored-by: Marek Smoliński <marek@goteleport.com>

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

Co-authored-by: Marek Smoliński <marek@goteleport.com>

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

Co-authored-by: Marek Smoliński <marek@goteleport.com>

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

Co-authored-by: Marek Smoliński <marek@goteleport.com>

* Regen AccessMonitoringRule from proto

* Remove unused imports

* Update api/proto/teleport/accessmonitoringrules/v1/access_monitoring_rules.proto

Co-authored-by: Marek Smoliński <marek@goteleport.com>

* Regren access monitoring rule from proto

* Regen access monitoring rules form proto

---------

Co-authored-by: Roman Tkachenko <roman@goteleport.com>
Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com>
Co-authored-by: Marek Smoliński <marek@goteleport.com>
2024-03-08 15:46:00 +00:00
Sakshyam Shah 0963dcc2fc Deprecate kindAppOrSAMLIdPServiceProvider, AppServerOrSAMLIdPServiceProvider and use types.SAMLIdPServiceProvider (#38709)
* remove and deprecate usage of KindAppOrSAMLIdPServiceProvider unified resource view

* use SAMLIdPServiceProvider type instead of AppOrSAMLIdPServiceProvider

* update unit tests replacing AppOrSAMLIdPServiceProvider

* update teleterm unifiedresource List func to discard AppServerOrSAMLIdPServiceProvider in favor of SAMLIdPServiceProvider

* make paginated ListSAMLIdPServiceProviders in auth_with_roles and various comment updates

* add nolint to apps.go and update teleterm unifiedresources test

* remove commented code, comment copy edit, reduce switch scope

* put AppOrSAMLIdPServiceProvider handling back, push Delete schedule to v17

* add nolint, saml resource list test

* put noint getResourceFromProtoPage elseif block

* comment copy update, uncomment saml type in teleterm
2024-03-06 18:11:53 +00:00
Mike Jensen 040ded2b79 Update google.golang.org/protobuf to v1.33.0 (#38995)
* Update google.golang.org/protobuf to v1.33.0

This updates all instances of google.golang.org/protobuf to address CVE-2024-24786.

* Make grpc after update
2024-03-05 22:48:09 +00:00
rosstimothy afde093e7e Register cluster configuration service (#38734)
Updates the auth gRPC server to include the new clusterconfigv1
service. The api client was also updated to allow interacting
with the new service(cluster audit config not included yet). Nothing
has yet been converted to use the new service, that will come in a
follow up.

The RPC service proto was also updated to fix a typo that was
reverted in https://github.com/gravitational/teleport/pull/38736.
2024-03-05 17:03:49 +00:00
rosstimothy ad2d83c42c Attempt to make TestClient_DialHost more reliable (#38856)
Takes inspiration from https://github.com/gravitational/teleport.e/pull/1944
which addressed similar EOF error showing up when driving streams
in tests.

From https://pkg.go.dev/google.golang.org/grpc#ClientStream.SendMsg:

> // SendMsg is generally called by generated code. On error, SendMsg aborts
> // the stream. If the error was generated by the client, the status is
> // returned directly; otherwise, io.EOF is returned and the status of
> // the stream may be discovered using RecvMsg.
2024-03-01 18:46:21 +00:00
Forrest e4330b1db2 pagination & sorting for access requests (#38633) 2024-02-29 22:09:43 +00:00
Forrest 1b1ea868e7 role pagination (#38714) 2024-02-29 18:40:33 +00:00
Michael Wilson 12c3f50fc5 Introduce a member count method to access lists. (#38650)
The access list interface now supports counting members without unmarshaling.
This method has been added to the generic backend service as well. This will
allow for quicker counts when necessary. This method has been added to the
cache.

Additionally, a status field as per RFD-153 has been added to access lists
that will house the new optional member count field.
2024-02-28 20:02:52 +00:00
Grzegorz Zdunek 54e331a69c Treat "expired certs" errors returned from RPCs as retryable on the client side (#38668)
* Handle "expired certs" errors that come from the server

* Review comments
2024-02-27 16:25:29 +00:00
cde86add39 Machine ID: Add Workload Identity Service (#38181)
* Add Workload Identity Service

* Fix up for recent changes this was rebased onto

* Usse atomic rather than mutex

* interface{} -> any

* Avoid concurrent read/write of experiment

* Prefer cleanup to defer

Co-authored-by: Jakub Nyckowski <jakub.nyckowski@goteleport.com>

* Update lib/auth/clt.go

Co-authored-by: Tim Buckley <tim@goteleport.com>

* Fix imports

---------

Co-authored-by: Jakub Nyckowski <jakub.nyckowski@goteleport.com>
Co-authored-by: Tim Buckley <tim@goteleport.com>
2024-02-26 11:43:51 +00:00
Krzysztof SkrzętnickiandBartosz Leper 9d7c59f9a4 Implement persistence for db_object_import_rule resource (#37806)
* Implement persistence for db_object_import_rule resource

* Apply suggestions from code review

Co-authored-by: Bartosz Leper <bartosz.leper@goteleport.com>

* Use plural interface name: DatabaseObjectImportRules. Fix typos. Refactor test.

* token => pageToken

* Simplify resource command

* Fix permission checks

* add details

* refactor, rebase fixes

* better name

* Fix several issues.

- Change type of `db_labels` proto field to the new shared `label` message.
- Implement missing method.
- Cause compilation errors in case of unipmlemented methods.
- Add test coverage for `tctl` commands.
- Change output of Marshal/Unmarshal methods.

* Fix test

* Fix nondeterminism in test

* Add mising docs

* Resolve protobuf breaking changes

* Shorten component name for logging

* Add access test

* Fix test

* Update error message and tests

* Remove temp test `TestCreateUser`

---------

Co-authored-by: Bartosz Leper <bartosz.leper@goteleport.com>
2024-02-22 03:54:27 +00:00
STeve (Xin) Huang 5cabb533a5 TLS Routing native WebSocket connection upgrade support (#36343)
* TLS routing connection upgrade using native websocket

* update ut in api

* lib/web/UT update

* fix typo, lint and race

* deal with subprotocol negotiation

* review comments round 1

* fix lint?

* add UT and address some other comments

* add env var to toggle mode

* fix lint
2024-02-12 18:04:01 +00:00
Brian Joerger b60e7a7a1f Hardware Key settings (#37727)
* Add hardware key settings to cluster auth preference.

* Parse HardwareKey auth settings from configuration file.

* Add GetRequireKnownSerialNumber method to AuthPrefence type.

* Add deprecation logic for authpref.PIVSlot, following the logic set out
in #16034.

* Address comments.
2024-02-08 20:59:00 +00:00
STeve (Xin) Huang e192ad386e Propagate user-agent from GRPC for cert.create events (#37726)
* Add user-agent to cert.create event

* fix tctl and minor stuff

* fix integration test
2024-02-08 20:39:43 +00:00
Alan Parra 57d3b43f6a Add the deprecated option GenerateUserSingleUseCerts (#37724)
* Deprecate the GenerateUserSingleUseCerts RPC

* Update generated protos
2024-02-02 19:18:44 +00:00
rosstimothy b7318b5c7e Enable errorlint via golangci-lint (#37669)
Adds the new linter and configures it to prevent direct error
comparisions and type assertions in favor of errors.Is and errors.As.
All current violations caught by the linter have been updated
accordingly.
2024-02-02 15:59:24 +00:00
Noah Stride 8c824ddd3b Remove deprecated Bot API methods (#37636)
* Remove deprecated Bot API methods

* Fix tests using deprecated RPC

* Fix more tests for legacy
2024-02-01 16:15:54 +00:00
Alan Parra 0013681f22 chore: Remove deprecated MFA streaming methods (#37589)
* Remove deprecated MFA streaming methods

* Drop the newMFADeviceFields.totpSecret field

* Hollow out / remove proto messages

* Update generated protos

* Remove unused method

* Simplify createRegisterChallenge logic

* Remove client methods
2024-02-01 14:15:36 +00:00
Alan Parra 5347e4e727 chore: Remove the deprecated GenerateUserSingleUseCerts method (#37601)
* Remove the deprecated GenerateUserSingleUseCerts method

* nit: Don't capture traces on guard errors

* Drop client methods

* Remove usages of SingleUseUserCert

* Hollow out / remove deprecated proto messages

* Update generated protos

* Remove unused method
2024-01-31 22:10:47 +00:00
Alan Parra 446505674b chore: Remove the AuthenticationSettings.DeviceTrustDisabled field (#37595) 2024-01-31 18:56:38 +00:00
Tiago Silva d71b48f9b5 Correct gRPC handler name StreamUnstructuredSessionEvents (#37580)
This PR fixes the name of the gRPC method
`StreamUnstructuredSessionEvents` from
`StreamUnstructuredSessionEventsServer` to the correct version. This
typo was introduced during the original review and was never detected
because clients implemented a fallback mechanism to old
`StreamSessionEvents` api.

This PR also partially reverts commit
386e63c584 so v15 clients can still
connect to v14 clusters.

Signed-off-by: Tiago Silva <tiago.silva@goteleport.com>
2024-01-31 11:05:01 +00:00