Commit Graph
294 Commits
Author SHA1 Message Date
Hugo Shaka 1453212f2a operator: add secret lookup to oidc's google_service_account (#67196) 2026-05-29 20:56:40 +00:00
rosstimothy 45a427eedc Rework scopes feature flags (#67073)
Replace the functions in the scopes package to infer if scoped features
are enabled with a concrete struct that is injected to consumers. This
permits tests to toggle scopes features without having to specify environment
variables.
2026-05-29 13:37:25 +00:00
Yassine Bounekhla c28001c8c9 Add web_terminal_copy_mode role option (#66597)
* add web terminal copy mode role option

* CR
2026-05-28 19:58:49 +00:00
Hugo Shaka 9443943375 crdgen: address scope-related bugs (#66955)
* crdgen: restore age column + fix additional column scoped bug

* Make scope field immutable

* Scope bots
2026-05-22 21:09:42 +00:00
Hugo Shaka e2c22ebd54 Add scoped mode for the operator (#66762)
This work is not production ready yet. While this work makes the
operator support running with a scoped token, this is not enough for a
public release.

Several failure modes must be addressed, including scoped name
conflicts, and operators fighting for ownership of a resource.
2026-05-22 20:48:45 +00:00
Hugo ShakaandAdam Carheden 479f8e59df Operator scope CRD column (#66730)
* Simplify crdgen scope API + add scope column

* re-generate operator CRDs

* fixup! re-generate operator CRDs

* Update schemagen.go

filed/field

---------

Co-authored-by: Adam Carheden <[email protected]>
2026-05-15 14:49:55 +00:00
williamong-tel 6500619d93 Add disconnect expired cert and lock mode for scoped role (#66376)
* Add disconnect expired cert and lock mode for scoped role

Update IAC docs

* respond to code review

Add a scoped authorizer in the forwarder_test

fix up proto comments

Update forwarder.go

* fix forwarder setting nil disconnectExpiredCert

* Update validate lock to accept empty string - will be treated as best_effort down the line

add comment
2026-05-14 21:51:48 +00:00
Noah Stride 1894178df3 Wildcard support for kubernetes join method (#66520)
* Add protos

* implement validation and matching support

* generated integrations stuff

* De Morgan, and his faithful followers, have once again defeated me in battle

* Udpate tests in lib/kube/token

* Extend join_kubernetes_test.go

* Fix missing param

* Extend validation tests

* Fix minor nits

* qF1001: CoUld aPpLY de MORgan'S LaW (stAticCHEck)
2026-05-13 08:47:24 +00:00
williamong-tel 947cb73f0c add enhanced session recording and session recording mode for scoped roles (#65996) 2026-05-11 22:37:12 +00:00
Kevin 4dcfcc608f Add RBAC rule review_requests.submit_for_users (#66254) 2026-05-07 20:49:43 +00:00
Adam Pickering e2dadc573e Remove redundant database configuration references in docs (#66447)
* Remove redundant database configuration references

This:
1. Adds documentation for the mysql_server_version field of proxy_service
   to the general config reference and improves formatting for a couple
   of fields there.
2. Removes database config/resource references that are redundant due to
   being covered by auto-generated docs or the more centralized teleport
   config docs.

* Update docs redirects

* Update internal links pointing to deleted pages

* Update DatabaseSpecV3.Protocol comment with allowed database protocol types

- This PR is removing the old `db` resource reference.
- The new `db` resource reference is generated from the DatabaseV3
  protobuf type.
- The old `db` resource reference defined the allowed values of the
  protocol field, whereas this information is not in the `DatabaseV3` type.
- docs/pages/identity-security/session-summaries.mdx links to the `db`
  resource reference, using it as a source of information on which values
  are allowed for the protocol field.

Therefore, we must update the DatabaseV3 protobuf type with information
on which values are allowed for the protocol field.
2026-05-07 17:44:48 +00:00
Gabriel Corado 59dc3182e3 Add TLS options to app spec (#65995)
* feat: add TLS options for app spec

* fix(service): missing app tls

* chore: missing generations

* refactor(api): update

* feat(api): add `tls://` scheme for TCP apps

* refactor: move app tls validation to services

* refactor(services): improve ca certificates validation

* refactor(services): move app tls validation to happen before public_addr early return

* refactor(services): remove time-based validations and allow single cert

* test: improve testing around tls fields

* refactor: code review suggestions

* chore(api): regenerate proto

* chore(docs): regenerate docs

* refactor(api): always return a copy of the allowed ca aliases

* chore(api): typo
2026-05-05 15:50:04 +00:00
Przemko RobakowskiandZac Bergquist d3fe70b2c2 Add locks support for Linux desktop (#65761)
* Add LinuxDesktop gRPC and backend

* Add LinuxDesktop resource to unified resources

* Remove CloneResource

* Review comments

* Fix logins

* Review comment

* Add ClonableResourceWithLabels

* Fix missing CloneResource

* Update lib/auth/linuxdesktop/linuxdesktopv1/service.go

Co-authored-by: Zac Bergquist <[email protected]>

* Proto changes for Linux Desktop

* Add locks support for Linux desktop

* Fix role

* Update lib/auth/auth_with_roles.go

Co-authored-by: Zac Bergquist <[email protected]>

* Update lib/web/ui/server.go

Co-authored-by: Zac Bergquist <[email protected]>

* Fix compilation

* Review comments

* Review comments

* fix e

---------

Co-authored-by: Zac Bergquist <[email protected]>
2026-04-29 08:50:19 +00:00
Marco Dinis 801c68a11d Add support for filtering by Organizational Units in IAM Join (#66241) 2026-04-29 08:01:05 +00:00
Tiago Silva 44c4a6990b sessionsearch[20]: Add TeleportRetrievalModelV1 operator reconciler (#66064)
Adds Kubernetes operator support for the RetrievalModel singleton. The
controller implements Get/Create/Update/Delete backed by the summarizer
gRPC service. Because RetrievalModel is a singleton, Get and Delete
ignore the name parameter and always operate on the fixed Teleport
resource.

Introduces withSingletonName(name string) as a typed CRD schema option that
emits a CEL x-kubernetes-validations rule enforcing metadata.name == name at
admission time. This is wired up for TeleportRetrievalModelV1, which must be
a cluster singleton named "retrieval-model".

On Kubernetes < 1.25, x-kubernetes-validations is not a recognized field in
JSONSchemaProps and causes helm to fail with a validation error. The Helm
CRD template now checks .Capabilities.KubeVersion against >= 1.25.0 and
strips the field from every CRD version's openAPIV3Schema before rendering
when the cluster does not support it.

A Mutate hook enforces that the Kubernetes CR must be named
"retrieval-model" before any Teleport call is made, surfacing a clear
status condition on wrongly-named CRs.
2026-04-27 17:09:48 +00:00
williamong-tel bd752ad322 Change from compare failed error to not found (#66145)
* Change from compare failed error to not found

* change reading in deletion to use backendreader - delete the CompareFailedError code block
2026-04-24 19:00:53 +00:00
williamong-tel d1b32e62c5 add scoped role assignments to k8s operator (#65623)
* add scoped role assignments for k8s

Fix tests and retrieving the scoped role assignments by adding subkind

Add additional catch to treat comparefailed error as not found for scoped role assignments

* fix merge conflict
2026-04-22 19:51:46 +00:00
williamong-tel ef25e8e6ba add scoped roles to k8s operator (#65573)
* add scoped roles to k8s operator

scoped role reorg

fix build

Update scopedrole_controller_test.go

fix tests

Remove unneded kind constant in constants.go in favor of the one in access.go

Deleted DeleteTeleportResouce

update to readnosecrets

* update deletion logic to look for not found error

Update teleport_reconciler_tests.go

Add back missing comment

* Update scopedrole_controller.go

* Remove unnecessary string matching
2026-04-22 18:25:31 +00:00
rosstimothy fc72fdcdc2 Update tests to inject modules instead of relying on modulestest.SetTestModules (#65976)
This is a pass on replacing modulestest.SetTestModules with supplying modules
where already possible. Some additional uses of modules.GetModules were also
replaced with localized modules injection to permit the removal of
modulestest.SetTestModules in tests. Most of the changes here are mechanical,
the one notable change is in TestSSHCommands. The test was not passing locally
because the shell (fish) builtin echo behaves differently. The easiest way
to produce expected output was to change the command invocation to use
/bin/echo to bypass any shell builtins for consistent behavior.

Inject modules into tool tests

Inject modules into integration tests

Inject modules into join server

Remove superflous enterprise modules in TestAuthenticationConfig_Parse_deviceTrustPB

Inject modules into signature algorithm config tests

Inject modules into TestGithubConnectorCRUDEventsEmitted

Inject modules into TestGetHierarchyForUser

Inject modules into kube proxy tests

Inject modules into controller tests

make fix-imports

add integration/app/fixture as test package
2026-04-22 17:38:51 +00:00
rosstimothy 5870768c88 Stop using text/template and html/template to enable DCE (#65401)
All existing template usage was converted to make use of
github.com/DataDog/datadog-agent/pkg/template. The DataDog package
is a fork of the stdlib template packages with method calling
removed so that reflect.MethodByName does not prevent DCE.

There were a handful of method calls in our templates that were trivially
changed to use custom functions defined via FuncMaps or specifying the
calculated value to the template instead of calling a function in the template.

A future change will add linter rules to prevent new text/template or
html/imports from landing. They have not been included here so as
to not to break enterprise code while it is migrated.
2026-04-22 15:54:43 +00:00
Gavin Frazar be216b5cb1 Add support for Azure tenant ID join rules (#65866)
* Fix broken switch statement

Error checks were skipped if AzureJoinConfig was nil

* Add support for Azure tenant ID join rules
2026-04-21 17:26:50 +00:00
nixpig 4f1dedbe5d Add APIs for handling Entra ID groups overage on SAML connectors (#65653)
* Add APIs for handling Entra ID groups overage on SAML connectors

* Restore redacted client secret on connector update

* Add test case for missing creds

* Regenerate resource docs

* Regenerate derived functions

* Overide IsEqual for SAMLConnectorSpecV2

* Update generated CRD and docs

* Update generated TF

* Remove junk from failed command

* Add API comments and update docs

* Exclude client_secret from Terraform schema

* Exclude client_secret from Terraform schema

* Update Terraform docs

* Reorder refill and validate

* Strip client secret in user path

* Add marshaler for SAMLConnectorSpecV2 type

* Add tests for stripping client secret on all paths

* Tidy up tests a bit

* Use protojson+protoadapt instead of jsonpb

* Ignore unknown fields on unmarshal

* Use Empty instead of Equal

* Add custom marshaling methods for SAML connector

* Add comment for use of nolint:depguard

* Fix core issue with marshaling oneof fields

* Refactor credentials oneof handling

* Add comments to connector methods

* Add comments for custom marshaler/unmarshaler

* Fix spelling mistakes in comments

* Refactor credentials handling so future additions don't silently fail

* Ensure consistent marshaling/unmarshaling of empty credentials

* Don't ensure non-empty client secret

* Refactor to enumerating field instead of oneof

* Add comment around validation

* Align validation on Upsert (create) with Create paths

* Defer to Fill.. methods determination of SAML connector existence

* Disable follow URLs validation

* Update proto comment to remove extra spaces from generated docs

* Mark client secret as sensitive in TF schema/docs

* Combine credentials and signing key refills

* Tidy up

* Regenerate types and docs

* Add TODO for credential availability when provider is enabled

* Update error messages for missing skp and creds

* Return connector without secrets

* Revert "Return connector without secrets"

This reverts commit 2ab4aae7d4.

* Add comment on validation callsite for empty argument

* Add godoc for connector with secrets validation

* Add godoc for error consts in secret refill

* Fix spelling in comment

* Fix spelling in error
2026-04-21 13:32:53 +00:00
Gabriel Corado 893e9cb28a Add LLM inference endpoint configuration (#65688)
* feat: llm subkind config

* refactor: code review suggestions

* refactor(api): change llm format and provider to string

* fix: update missing references

* feat: update CRDs with new app spec options

* feat: update docs and terraform

* chore(api): update derived values and nil checker

* refactor(app): move not implemented error to servehttp to avoid leaks

* refactor: remove presentation (webui/teleterm) changes

* refactor(auth): remove unified resources changes
2026-04-16 21:58:45 +00:00
Tim Buckley edabc9f89c MWI Scopes[4]: Scoped bot joining and bound keypair support (#65366)
* MWI: Support scoped join tokens in the bound keypair join method

* Bot fields for scoped tokens

* Check bot scope

* Allow bound keypair tokens to pass scope validation

* Support bots

* Fix outstanding references to ProvisionTokenV2

* Zero check on MustRegisterBefore due to proto impl differences

* Properly pass through nil must_register_before

* Also fix nil timestamps in bound keypair status

* And fix rotate_after

* Add BotInternal certificate field

* Add 'bot' TokenUsageMode value and require for bot joins

* Fix mutator execution for scoped bound keypair joining

* Implement more ScopedToken StrongValidateToken checks for bots

Adds a few more of the bot-specific RFD validation checks for bots.

* Improve bot join checks for scoped joining

* Fix build after rebase and add additional RFD checks

This fixes builds after upstream updates and implements a few more
validations required by the RFD:
- AssignedScope field for bots must be empty
- Moved original AssignedScope check to validateNonBot() since it was
  checked unconditionally before.
- BotScope must be a presumably-valid scope at creation time

* Use scope-aware access checker for initial bot certs

* Fix WeakValidateToken() for scoped tokens for bots

WeakValidateToken() was not updated to match the new checks in
StrongValidateToken(); this adds minimal bot-related exemptions
around `assigned_scope` for bots to allow it to be read without
error.

* Add tests for scoped bot tokens, fix role bug

This adds a set of additional token tests for scoped bot tokens, and
fixes an issue where WeakValidateToken() was erroneously rejecting
invalid system roles.

* Properly initialize bound keypair scoped tokens on creation/upsert

We weren't applying the same initialization logic for scoped tokens
that we did for ProvisionTokenV2; this is required for registration
secrets to work properly.

* Update CRDs

* Fix failing test

* Specify types for bound keypair timestamp fields

* Update terraform resources

* Fix lint

* Include bot scope in BotJoin audit events

This includes the bot scope in audit events. It includes the user
label bot scope for successful joins where the user has been fetched,
and otherwise includes the bot scope configured on the token.

* Reject `token` join method for scoped bot tokens

Bot joining should use `bound_keypair`, so reject scoped bot tokens
that attempt to join with the traditional `token` join method.

* Fix failing test due to BotInternal cert parameter

TestRegisterBotInstance wasn't updated to include the BotInternal
flag on initial identity, so this includes it.

* Actually include Scope in bot audit events

* Mutate correct token status in `patchToken`

The mutate result was discarded because the wrong status object was
passed to `mutateScopedToken`.

* Use ScopedAuthorizer in join/Server.authenticate()

`authenticate()` currently rejects scoped identities which prevented
clients from reauthenticating with an existing identity, which is
important for bot renewal and bound keypair joining.

* Pass `BoundHostID` through properly in `GetBoundKeypairStatus()`

* Add basic TestJoinBoundKeypair_ScopedToken test

* Fix lint

* Update join server comments, add note about feature flag edge case

* Target correct provision token for standard token mutations

* Return correct mutated token in patchToken()

* Hide bound keypair registration secrets when `WithSecrets` is unset

* Avoid possible nil pointer dereference

* Address proto comment suggestion from review

* Deduplicate bound keypair mutator validation logic

Validation logic has been pulled out into a `validate()` interface
function and unified for both token types; scoped token bound keypair
fields are converted to their equivalent ProvisionTokenV2 variant
using existing helper logic.

* Nil check in consumeRecoveryMutator.validate()

* Simplify lastRotatedAtMutator

This removes the confusing switch with fallthroughs in favor of 2
simple ifs and a helper function.

* Ensure bound keypair status is non-nil before mutating

* Note non-nil requirement for new lastRotatedAt value

* Update generated operator resources

* Also nil-check status for standard tokens

* Mirror secret censoring for bound keypair secrets in tctl

This mirrors the existing secret censoring in tctl. It doesn't
actually work since the conditional can never be true.

* Use StrongValidate() on BotScope in token StrongValidate()

`validateBotToken()` was incorrectly calling `scopes.WeakValidate()`
on the bot scope. This changes it to call `scopes.StrongValidate()`
instead.

* Mark scoped token bound keypair registration_secret field as sensitive

* Make lastRotatedAtMutator's `mutateScopedToken` nil-safe

* Tag mutator validation errors with a unique name of the mutator

Errors are tagged with the primary field that mutator modifies to
help identify the failing mutator without necessarily identifying
the specific failing check.

* Address code review feedback

* Wait for ScopedRoleAssignment to become available

SRAs don't always propagate immediately, so adds a
`require.EventuallyWithT()` check to ensure it exists before
continuing.

* Add test for scoped bot joining via kubernetes

* Fix formatting
2026-04-16 02:06:24 +00:00
Noah Stride 591bfc8e2f Support enterprise/enterprise_id in github join method (#65655)
* Support enterprise_id/enterprise in gha

* Update various IaC

* Update reference

* Add explicit warning to docs and update reflect_legacy_test
2026-04-13 12:10:42 +00:00
Dan Upton ca377d262a Add support for beams to RBAC roles (#65511)
* Add support for beams to RBAC roles

* Add KindBeam to LabelMatcherKinds

* Update CRDs

* Add beam labels and expression to role/trait tests
2026-04-09 17:50:35 +00:00
Noah Stride 3ce2b94394 MWI Scopes[1]: Bot resource and RPCs (#64551)
* MWI Scopes[1]: Bot resource and RPCs

* Address forrest feedback
2026-04-09 10:16:31 +00:00
Kevin 19d0f649f1 operator: Add lock resource to kubernetes operator (#65299)
* Add lock resource to kubernetes operator

* Rename kube resource to use kind

* Address feedback
2026-04-08 18:25:57 +00:00
Edoardo Spadolini e732eb93bb session-helper: fix operator and kube-agent-updater builds (#65466) 2026-04-07 17:29:43 +00:00
Hugo Shaka eb21bbb61e Invert crdgen kindInVersion option (#65382)
We introduced this new option to implement RFD 160 but we forgot to add
it on a couple of resources. To rpevent this to happen again, the option
was inverted (legacy resoucres have to specify it).

The resourceSchemaConfig was also changed so its zero value does the
right thing by default.

This has no functional effect, CRDs are identical before and after the
change.
2026-04-07 17:26:08 +00:00
Erik Tate cf1a42f1e1 Improving validation errors for scoped kube tokens (#65391)
* adding more specific error message for unspecified kube join type

* generating terraform docs and operator crd
2026-04-07 14:17:37 +00:00
Erik Tate 2c2c8bd0ba adding support for kubernetes join methods while using scoped tokens (#64387) 2026-03-20 20:31:43 +00:00
williamong-tel 757df46846 add testing instructions for k8s operator integration (#64388)
* add testing instructions

* Added additional troubleshooting for make image

* Enhance troubleshooting steps for local image build

Updated troubleshooting instructions for local image build in CONTRIBUTING.md.
2026-03-18 03:36:07 +00:00
williamong-tel e444c979ca add k8s operator support for scoped tokens (#64034)
Add scoped tokens to k8s operator

address linter

Update crds

Add updated contributing.md and missing rbac for scoped tokens

Update CONTRIBUTING.md

Update zz_generated.deepcopy.go

Update Makefile

Update CONTRIBUTING.md

Update config.yaml

Add scope to root level crd instead of part of spec. Add OverrideVersionKind and regenerate crds and generated files

Update scopedtoken_types.go

Address incorrect immutable labels mapping

Update resources-teleport-dev-scopedtokensv1.mdx

Update scopedtoken_controller.go

Update schemagen.go

Update resources-teleport-dev-scopedtokensv1.mdx
2026-03-13 02:43:47 +00:00
williamong-tel 8f9694be94 Fix operator map generation (#64459)
* fix mapping gen

make crd

Update schemagen.go

update format

fix docs

update map key

fix

fix formatting

fix formatting

Update format.go

Update format.go

* Update resources-teleport-dev-accesslists.mdx

* add back nullable

fix nullable

* Add schema test

Update schema_test.go

Update schema_test.go
2026-03-12 22:35:09 +00:00
Nic Klaassen 2a23ceb829 feat: add scoped roles field to access list types (#63919) 2026-03-10 23:29:33 +00:00
Adam Carheden b7037a17ed Add SAML IdP Service Provider support to k8s operator (#64289)
* Add SAML IdP Service Provider support to k8s operator

changelog:
- Add SAML IdP Service Provider support to k8s operator

See integrations/operator/CONTRIBUTING.md for operator resource pattern.

* Fixed typo in comment and unnecessary log message change

* Added V1 to SAML IdP Servicce Provider k8s kind
2026-03-06 15:26:14 +00:00
Hugo Shaka 6cbe8109d0 skip operator flaky TC test (#64319) 2026-03-05 20:21:55 +00:00
rosstimothy ff714af486 Inject insecure mode instead of relying on global variable (#63825)
Part 1 or removing InsecureDevMode - enterprise still relies on it
so a few TODOs were left around for clean up later. This global is
mostly leveraged in tests to permit trust when self-signed certificates
are used. These tests are often spinning up multiple teleport instances
and most of the time exercise trusted clusters which makes them slow.
Due to the global nature of InsecureDevMode these tests cannot be
run in parallel.
2026-03-05 16:31:10 +00:00
Hugo Shaka bb1afe2816 Fix flaky operator update test (#64266)
* Fix flaky operator update test

The synchronous update operator test was only comparing resource spec to
know if a resource got propagated into cache.

Some updates were not changing the spec (only bumping the revision),
this check did not wait for them properly. This allowed the test to
proceed while the cache was not up-to-date yet, causing the operator to
read stale data from the cache and face a conflict when calling the
update RPC.

This fix waits for the revision to change before allowing the test to
continue. With both the spec and revision change check, we are more
confident that the previous reconciliation change entered the cache.

* workaround revision-less resources
2026-03-05 00:34:24 +00:00
Hugo Shaka 1e55d0a493 Log in the operator test if something caused a conflict (#63776)
* Log in the operator test if something caused a conflict

Some resources seem edited by Teleport or something else in the
background. This break the operator tests and should not happen.
This commit adds more logging if this is detected.

* address feedback + fix a race in the standard test + fail if we see an unknown error
2026-03-02 18:54:48 +00:00
Luke Okraszewski eea85f5f49 [ci] add upload of test results to s3 (#63629)
The upload steps are non-blocking, should they
fail the workflow status will not be affected.

This commit also changes the way the test logs are created,
now each Makefile accepts `TEST_LOG_DIR` as an optional parameter,
defaulting to `./test-logs`. This allows the top level Makefile
to propagate the location for the sub modules to write their
junit output, such that the CI jobs do not need to track
which top level make target corresponds to which directory.
Instead a simple glob is used to grab all the xml JUNIT files.

This approach also allows more targets to be added or removed in the future
without modifying the CI job definitons. Another benefit is allowing
the caller to modify the output destination should we want to bundle
the files as job artifacts in the future.

Makes `TEST_LOG_DIR` an order only dep for all targets.
2026-02-20 14:23:25 +00:00
Bartosz Leper d8c5fb7a1d Add missing deletion tests to the k8s operator (#63731)
* Support inference_model in k8s operator

* Support inference_policy in k8s operator

* Support inference_secret in k8s operator

* Add missing deletion tests to the k8s operator

The deletion drift tests didn't actually verify that the resource is
deleted; it tested a case where the resource is first deleted from the
Teleport cluster, and only then marked for deletion in Kubernetes.
Removing the entire the deletion method's logic didn't cause the
deletion drift tests to break.

* Don't change the e ref
2026-02-18 11:18:06 +00:00
Hugo Shaka f951766a68 operator: access_monitoring_rule support (#63745)
* operator: add accessmonitoringrule CRDs

* operator: grant access to AMRs

* operator: add types for amrs

* operator: add AMR controller and tests
2026-02-13 15:18:10 +00:00
Hugo Shaka a2e920c204 operator: add test Makefile target + fix local builds on MacOS (#63778) 2026-02-12 21:00:00 +00:00
Bartosz Leper 3a8f78d35f Support inference_secret in k8s operator (#63693)
* Support inference_model in k8s operator

* Support inference_policy in k8s operator

* Support inference_secret in k8s operator
2026-02-12 14:45:54 +00:00
Bartosz Leper d97a93548c Support inference_model and inference_policy resources in k8s operator (#63553)
* Support inference_model in k8s operator

* Support inference_policy in k8s operator
2026-02-12 10:45:13 +00:00
Hugo Shaka 81fdb2910a Bump controller tools to fix build (#63599) 2026-02-06 20:13:07 +00:00
Hugo Shaka d21042c556 Cleanup synchronous oeprator tests (#63519) 2026-02-05 14:10:18 +00:00
Hugo Shaka 905edc9efe Convert non-standard into standard tests (#62946) 2026-02-03 21:11:24 +00:00