Skip to content

Commit 8d49072

Browse files
Merge remote-tracking branch 'origin/release-1.9.2' into flip-wxo-ff
2 parents 1937615 + bc16a40 commit 8d49072

31 files changed

Lines changed: 1683 additions & 99 deletions

File tree

docs/docs/Develop/contributing-telemetry.mdx

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,26 @@ This telemetry event is sent when an unhandled exception is captured by Langflow
9090
- **Type**: The exception class name, such as `ValueError`.
9191
- **Message**: The exception message that was raised.
9292
- **Context**: Additional contextual information related to where the exception occurred, such as route, component, or operation details, when available.
93-
- **StackTraceHash**: A hash of the stack trace used to group similar exceptions for easier analysis.
93+
- **StackTraceHash**: A hash of the stack trace used to group similar exceptions for easier analysis.
94+
95+
### Deployment provider
96+
97+
This telemetry event is sent for various lifecycle operations on deployment provider accounts, such as create, delete, and update.
98+
99+
- **DeploymentAction**: The specific action performed, such as `provider.create` or `provider.delete`.
100+
- **DeploymentProvider**: The deployment provider used, such as `watsonx-orchestrate`.
101+
- **DeploymentSeconds**: Duration in seconds for the operation, providing performance insights.
102+
- **DeploymentSuccess**: Boolean value indicating whether the operation was successful.
103+
- **DeploymentErrorMessage**: Error message details if the operation was unsuccessful.
104+
- **WxoTenantId**: A unique identifier for the tenant, populated only for `watsonx-orchestrate` deployments, used to understand multi-tenant usage patterns without collecting personal information.
105+
106+
### Deployment
107+
108+
This telemetry event is sent for various lifecycle operations on deployment resources, such as create, delete, and update.
109+
110+
- **DeploymentAction**: The specific action performed, such as `deployment.create`.
111+
- **DeploymentProvider**: The deployment provider used, such as `watsonx-orchestrate`.
112+
- **DeploymentSeconds**: Duration in seconds for the operation, providing performance insights.
113+
- **DeploymentSuccess**: Boolean value indicating whether the operation was successful.
114+
- **DeploymentErrorMessage**: Error message details if the operation was unsuccessful.
115+
- **WxoTenantId**: A unique identifier for the tenant, populated only for `watsonx-orchestrate` deployments, used to understand multi-tenant usage patterns without collecting personal information.

docs/versioned_docs/version-1.9.0/Deployment/deployment-wxo.mdx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ import Tabs from '@theme/Tabs';
88
import TabItem from '@theme/TabItem';
99
import PartialGlobalModelProviders from '@site/docs/_partial-global-model-providers.mdx';
1010

11+
:::tip
12+
As of Langflow 1.9.2, the IBM watsonx Orchestrate deployments feature is behind a feature flag. To enable it, set the following environment variable before starting Langflow:
13+
14+
```bash
15+
LANGFLOW_FEATURE_WXO_DEPLOYMENTS=true
16+
```
17+
:::
18+
1119
Create a flow and deploy it to [IBM watsonx Orchestrate](https://www.ibm.com/docs/en/watsonx/watson-orchestrate/base?topic=getting-started-watsonx-orchestrate).
1220

1321
Deploying a flow on IBM watsonx Orchestrate is different from the other Langflow deployment options.

docs/versioned_docs/version-1.9.0/Develop/contributing-telemetry.mdx

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,26 @@ This telemetry event is sent when an unhandled exception is captured by Langflow
9090
- **Type**: The exception class name, such as `ValueError`.
9191
- **Message**: The exception message that was raised.
9292
- **Context**: Additional contextual information related to where the exception occurred, such as route, component, or operation details, when available.
93-
- **StackTraceHash**: A hash of the stack trace used to group similar exceptions for easier analysis.
93+
- **StackTraceHash**: A hash of the stack trace used to group similar exceptions for easier analysis.
94+
95+
### Deployment provider
96+
97+
This telemetry event is sent for various lifecycle operations on deployment provider accounts, such as create, delete, and update.
98+
99+
- **DeploymentAction**: The specific action performed, such as `provider.create` or `provider.delete`.
100+
- **DeploymentProvider**: The deployment provider used, such as `watsonx-orchestrate`.
101+
- **DeploymentSeconds**: Duration in seconds for the operation, providing performance insights.
102+
- **DeploymentSuccess**: Boolean value indicating whether the operation was successful.
103+
- **DeploymentErrorMessage**: Error message details if the operation was unsuccessful.
104+
- **WxoTenantId**: A unique identifier for the tenant, populated only for `watsonx-orchestrate` deployments, used to understand multi-tenant usage patterns without collecting personal information.
105+
106+
### Deployment
107+
108+
This telemetry event is sent for various lifecycle operations on deployment resources, such as create, delete, and update.
109+
110+
- **DeploymentAction**: The specific action performed, such as `deployment.create`.
111+
- **DeploymentProvider**: The deployment provider used, such as `watsonx-orchestrate`.
112+
- **DeploymentSeconds**: Duration in seconds for the operation, providing performance insights.
113+
- **DeploymentSuccess**: Boolean value indicating whether the operation was successful.
114+
- **DeploymentErrorMessage**: Error message details if the operation was unsuccessful.
115+
- **WxoTenantId**: A unique identifier for the tenant, populated only for `watsonx-orchestrate` deployments, used to understand multi-tenant usage patterns without collecting personal information.

docs/versioned_docs/version-1.9.0/Support/release-notes.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ For all changes, see the [Changelog](https://github.com/langflow-ai/langflow/rel
112112
This workflow packages a selected flow version for use in IBM watsonx Orchestrate.
113113
For more information, see [Deploy Langflow on watsonx Orchestrate](../Deployment/deployment-wxo.mdx).
114114

115+
As of Langflow 1.9.2, this feature is behind a feature flag. To enable it, set `LANGFLOW_FEATURE_WXO_DEPLOYMENTS=true` before starting Langflow.
116+
115117
- **Policies** component (beta)
116118

117119
The **Policies** component uses [ToolGuard](https://github.com/AgentToolkit/toolguard) to generate guard code from natural-language business policies and apply it to agent tools.

src/backend/base/langflow/api/utils/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
build_graph_from_db,
4444
build_graph_from_db_no_cache,
4545
cascade_delete_flow,
46+
scope_session_to_namespace,
4647
verify_public_flow_and_get_user,
4748
)
4849

@@ -85,6 +86,7 @@
8586
"parse_value",
8687
"raise_error_if_astra_cloud_env",
8788
"remove_api_keys",
89+
"scope_session_to_namespace",
8890
"validate_is_component",
8991
"verify_public_flow_and_get_user",
9092
]

src/backend/base/langflow/api/utils/flow_utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,26 @@ def compute_virtual_flow_id(identifier: str | uuid.UUID, flow_id: uuid.UUID) ->
135135
return uuid.uuid5(uuid.NAMESPACE_DNS, f"{identifier}_{flow_id}")
136136

137137

138+
def scope_session_to_namespace(session: str | None, namespace: str) -> str | None:
139+
"""Wrap a caller-supplied session ID under a (client_id, flow_id) namespace.
140+
141+
Mitigates CVE-2026-33017: an unauthenticated public-flow caller cannot
142+
address a session that lives outside its own namespace through a Memory
143+
component, regardless of whether the caller supplies a non-empty,
144+
pre-prefixed, or empty string.
145+
146+
Returns ``None`` unchanged. Returns the value unchanged when it equals the
147+
namespace or already starts with ``f"{namespace}:"``. Otherwise prefixes
148+
it -- including the empty-string case, which becomes ``f"{namespace}:"``.
149+
"""
150+
if session is None:
151+
return session
152+
prefix = f"{namespace}:"
153+
if session == namespace or session.startswith(prefix):
154+
return session
155+
return f"{prefix}{session}"
156+
157+
138158
async def verify_public_flow_and_get_user(
139159
flow_id: uuid.UUID,
140160
client_id: str | None,

src/backend/base/langflow/api/v1/chat.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
format_exception_message,
3232
get_top_level_vertices,
3333
parse_exception,
34+
scope_session_to_namespace,
3435
verify_public_flow_and_get_user,
3536
)
3637
from langflow.api.v1.schemas import (
@@ -661,6 +662,9 @@ async def build_public_tmp(
661662
- The 'data' parameter is NOT accepted to prevent flow definition tampering
662663
- Public flows must execute the stored flow definition only
663664
- The flow definition is always loaded from the database
665+
- Caller-supplied 'inputs.session' is namespaced under the (client_id,
666+
flow_id) virtual flow ID so an unauthenticated caller cannot address a
667+
session that lives outside its own namespace (CVE-2026-33017)
664668
665669
The endpoint:
666670
1. Verifies the requested flow is marked as public in the database
@@ -703,6 +707,12 @@ async def build_public_tmp(
703707
authenticated_user_id=authenticated_user_id,
704708
)
705709

710+
# Defends CVE-2026-33017: scope caller session into the (client_id, flow_id) namespace.
711+
if inputs is not None and inputs.session is not None:
712+
scoped_session = scope_session_to_namespace(inputs.session, str(new_flow_id))
713+
if scoped_session != inputs.session:
714+
inputs = inputs.model_copy(update={"session": scoped_session})
715+
706716
# Validate the stored flow data after the public-access boundary.
707717
# Public flows never accept client-supplied data.
708718
async with session_scope() as session:

0 commit comments

Comments
 (0)