Commit Graph
89480 Commits
Author SHA1 Message Date
John ChiltonandClaude Opus 4.8 e4e29c74e1 WES: use standard workflow accessibility check for gxworkflow:// refs
Ownership-only check rejected published/shared workflows that a normal
invocation would accept. Defer to get_stored_accessible_workflow, update
docs, add API tests for published + inaccessible cases.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 08:16:48 -04:00
John ChiltonandClaude Opus 4.8 1981c78e84 Add developer GA4GH WES API guide
Client walkthrough (curl) of submit/monitor over WES v1.0.0: state mapping,
gxworkflow:// scheme, engine params, tasks, pagination, errors, limitations.
Cross-link admin <-> dev docs; point at gxy-wes / gxy-wes-bioblend examples.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:31:27 -04:00
John ChiltonandClaude Opus 4.8 685437ec66 Fix WES state mapping for completed/materializing invocations
completed invocations reported WES UNKNOWN (unmapped); map to COMPLETE.
Add requires_materialization -> INITIALIZING.
Strengthen test_wes_state_mapping: wait for completion, assert COMPLETE.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 16:31:00 -04:00
John Chilton 6ec6221ca2 Merge pull request #22846 from mvdbeek/tag-creation-deadlock
[26.0] Fix tag creation self-deadlock under SQLite
2026-06-08 10:15:07 -04:00
mvdbeek 54c93a609b Fix tag creation self-deadlock under SQLite
`TagHandler._create_tag_instance` created the `Tag` in a *separate* session
and committed it, to keep a unique-name `IntegrityError` from aborting the
caller's transaction. When this runs inside an open write transaction - e.g.
applying a tag to an output during workflow job creation - that second
connection's commit deadlocks against the first on SQLite's single-writer
lock, surfacing intermittently as "(sqlite3.OperationalError) database is
locked" and failing the job (and the workflow invocation). It is timing
sensitive, so any small latency in the surrounding code makes it reproducible.

Insert the tag on the session's own connection with
`INSERT ... ON CONFLICT (name) DO NOTHING` (SQLite and PostgreSQL both support
it natively), preserving the duplicate-name isolation without a second
connection. Other backends keep the separate-session fallback - the
single-writer deadlock is SQLite-specific.
2026-06-07 11:47:52 +02:00
John Davis 9f15c50fb3 Merge pull request #22834 from jdavcs/26.0_package_build_fix2
[26.0] Move classifiers and keywords from setup.cfg to pyproject.toml
2026-06-05 23:03:19 -04:00
John Davis b884af499b Move classifiers and keywords from setup.cfg to pyproject.toml
When a [project] table is present in pyproject.toml, setuptools
ignores fields in setup.cfg unless they are listed in the dynamic
array.  This applies to classifiers and keywords: the build was
silently dropping them from the wheel metadata.

Fix: define classifiers and keywords as static values directly in the
[project] section of each package's pyproject.toml, and remove them from
setup.cfg.

Alternate fix: add both to the dynamic list, keeping the definitions in
setup.cfg. However, I think the first is better since that keeps
pyproject.toml as the single source of truth.
2026-06-05 09:32:41 -04:00
Nicola Soranzo 4c32c1f299 Merge pull request #22832 from nsoranzo/release_26.0_22825_followup
[26.0] Drop console scripts from packages' ``setup.cfg`` files
2026-06-05 13:57:56 +01:00
Nicola Soranzo 6b0d47911b Drop console scripts from packages' `setup.cfg` files
Follow-up on https://github.com/galaxyproject/galaxy/pull/22825#issuecomment-4625193313
2026-06-05 12:15:43 +01:00
John Davis 09b9b3da46 Start work on 26.0.2.dev0 2026-06-04 23:24:59 -04:00
John Davis 57b0c3040d Create version 26.0.1 v26.0.1 2026-06-04 23:24:54 -04:00
John Davis 5d9dc015e0 Merge pull request #22825 from jdavcs/26.0_package_entrypoints
[26.0] Fix missing scripts in built wheels
2026-06-04 14:26:52 -04:00
John Davis be90bf05cb Fix missing console scripts in built wheels
When [project] is defined in pyproject.toml, setuptools does not include
[options.entry_points] from setup.cfg in the built wheel.

Solution: move console script definitions to [project.scripts] in
pyproject.toml for all affected packages.
2026-06-04 13:49:08 -04:00
Dannon 62975a0ecb Merge pull request #22820 from mvdbeek/fix-value-omission
[26.0] Fix ConnectedValue leak for omitted optional inputs inside groups
2026-06-04 08:48:27 -04:00
mvdbeek 51f9c720df Tolerate null list elements for optional data parameters
#22617 routed every non-dict/non-instance value in a multiple data
parameter's value list through `_decode_dataset_id`, which raises
`ParameterValueError("invalid dataset id None")` for anything that isn't
an int/digit/16-char id. An unset optional data input connected to a
`multiple="true"` data parameter arrives as a null list element
(`[None]`), so the job failed at preparation with "invalid dataset id
None" instead of running. Before #22617 this path did
`query(HistoryDatasetAssociation).get(None)` -> `None`, so the null was
tolerated and the tool saw no dataset.

Filter `None`/`"None"`/`""` list elements in `DataToolParameter.from_json`
(matching the existing `to_python` behaviour) so null is tolerated as
"no dataset" while genuinely malformed ids are still rejected. This
restores correct execution of workflows that leave an optional data
input unset (the UI submits explicit null for such inputs).
2026-06-04 09:11:18 +02:00
mvdbeek f4d1710fd8 Fix ConnectedValue leak for omitted optional inputs inside groups
When an optional parameter_input is omitted from a workflow invocation and
connected to a tool parameter nested inside a conditional/repeat/section, the
unresolved ConnectedValue sentinel leaked into the templated command line, e.g.
`-adapter_sequence '<galaxy.tools.parameters.workflow_utils.ConnectedValue
object at 0x...>'`.

visit_input_values forwards a `payload` dict to its recursive calls for grouped
inputs, but that payload omitted `replace_optional_connections`, so nested
params fell back to the default `False` and the sentinel-replacement branch in
callback_helper never ran for them. Propagate the flag through recursion so
nested optional connections are resolved to the tool parameter's own default,
preserving the not-provided/explicit-null distinction (top-level data params
still receive None as before).

Add a framework workflow regression test that connects an omitted optional
text parameter_input to a text param inside a conditional (boolean_conditional)
and asserts the tool's own default is used with no ConnectedValue leak.
2026-06-03 23:19:24 +02:00
Nicola Soranzo fb6e3f8d70 Merge pull request #22815 from nsoranzo/release_26.0_fix_client_linting
[26.0] Fix client linting
2026-06-03 19:09:42 +01:00
Nicola Soranzo c5d80e70b6 Fix client linting
Fix:

```
/home/runner/work/galaxy/galaxy/client/src/entry/analysis/modules/Home.vue
Warning:    1:1  warning  Component name "Home" should always be multi-word                          vue/multi-word-component-names
Error:   48:5  error    The "computed" property should be above the "mounted" property on line 35  vue/order-in-components
```

Broken in https://github.com/galaxyproject/galaxy/pull/22720 .
2026-06-03 15:36:45 +01:00
Nicola Soranzo 975547dcf4 Merge branch 'release_25.1' into release_26.0 2026-06-03 14:52:33 +01:00
John Chilton a8363f5f47 Merge pull request #22810 from ahmedhamidawan/fix_flex_panels_resizing_over_iframes
[26.0] Fix `FlexPanel` drag handle gets stuck when dragging over iframe
2026-06-03 07:58:13 -04:00
Ahmed Awan be693e824f [26.0] Fix FlexPanel drag handle gets stuck when dragging over iframe
We just needed to update the `isDragging` variable when the `DraggableSeparator` is being dragged. This ensures the `interaction-overlay` is in sync with the dragging operation.

Fixes https://github.com/galaxyproject/galaxy/issues/20349
2026-06-02 12:15:32 -05:00
David López c0df64da72 Merge pull request #22802 from nilchia/update_spdata_class
[25.1] update the binary.py for spatialdata so it also works if the file has…
2026-06-02 11:34:39 +02:00
Amirhossein Naghsh Nilchi 1f38d21587 it works now even in nested directories 2026-06-01 19:49:34 +02:00
Amirhossein Naghsh Nilchi 137b6f4e12 update the binary.py for spatialdata so it also works if the file has no extension 2026-06-01 17:12:42 +02:00
Marius van den Beek bffa5c7387 Merge pull request #22785 from mvdbeek/25.1_into_26.0_29_05_26
[26.0] Merge 25.1 into 26.0
2026-05-29 17:37:19 +02:00
mvdbeek a8fa956fc1 Merge branch 'release_25.1' into release_26.0 2026-05-29 16:44:48 +02:00
Marius van den Beek d3624268c3 Merge pull request #22778 from mvdbeek/backport_fastapi_starlette_upgrade
[25.1] Backport FastAPI/Starlette upgrade for BadHost (CVE-2026-48710)
2026-05-29 10:28:58 +02:00
mvdbeekandNicola Soranzo 6b07f5492f [25.1] Backport FastAPI/Starlette upgrade for BadHost (CVE-2026-48710)
Updates the pinned FastAPI/Starlette versions on release_25.1 to match
upstream/dev, closing CVE-2026-48710 ("BadHost"). The vulnerability lets
an attacker inject a path into the HTTP Host header and have
``request.url.path`` reflect that path, bypassing path-based access
control in middleware. Starlette 1.0.1+ rejects Host headers with
invalid characters; we pin starlette==1.1.0 to match dev.

Drops Python 3.9 support, matching upstream/dev (commit eb9fde1dcd).
Starlette dropped 3.9 in 0.50.0, so the BadHost fix (starlette >= 1.0.1)
cannot be installed on 3.9. Bumping the floor to 3.10 is the only way
to ship the security fix; the alternative -- marker-splitting the pins
to keep 3.9 on starlette 0.49.x -- would leave 3.9 users exposed to the
CVE we are trying to close.

Actual exposure on release_25.1 (pre-fix)
-----------------------------------------

Galaxy was running a vulnerable starlette but is **not exploitable for
the headline auth-bypass scenario**. Auth runs through FastAPI
dependencies (``get_user``, ``get_trans``, ``AdminUserRequired``), not
through path-string checks in middleware. ``AccessLoggingMiddleware``
already uses ``scope["path"]``; ``add_galaxy_middleware`` /
``GalaxyCORSMiddleware`` / ``RawContextMiddleware`` /
``SentryAsgiMiddleware`` do not branch on ``request.url.path``.

Lower-severity findings that this upgrade also closes:

- ``lib/galaxy/webapps/base/api.py`` ``get_error_response_for_request``
  picks an error schema with ``"ga4gh"/"drs"/"trs" in
  request.url.path`` -- spoofable Host nudges error payload shape
  (info-disclosure / shape confusion only).
- ``lib/galaxy/webapps/galaxy/api/drs.py`` and
  ``lib/galaxy/webapps/galaxy/services/datasets.py`` derive DRS
  ``service_info`` / ``self_uri`` from ``request.url`` -- spoofable
  Host poisons the advertised DRS identity and client-visible URIs,
  not access.
- ``lib/tool_shed/webapp/api2/tools.py`` -- same shape, TRS service
  info.

Bumping the pin closes the parser flaw at source and downgrades all of
the above to non-issues, so no separate ``request.url.path ->
scope["path"]`` sweep is needed.

Pin bumps (cherry-picks the relevant ranges from PRs #21526, #22206,
#22754):

- fastapi 0.118.0 -> 0.136.3
- starlette 0.48.0 -> 1.1.0
- starlette-context 0.4.0 -> 0.5.1
- python-multipart 0.0.20 -> 0.0.29
- anyio 4.11.0 -> 4.13.0

Required code changes backported from upstream/dev:

- ``lib/galaxy/webapps/openapi/_compat/v2.py``: import
  ``GenerateJsonSchema`` and ``get_flat_models_from_fields`` from
  ``fastapi._compat.v2`` and adopt the new ``get_definitions()``
  implementation for FastAPI 0.128.8+ (PRs #21384, dev commits
  0800c025ce, c8ccc7f44d, b3bfb45884).
- ``lib/galaxy/webapps/openapi/utils.py``: route ``GenerateJsonSchema``
  through ``_compat.v2`` and drop the now-unreachable
  ``get_compat_model_name_map`` fallback (dev commit b3bfb45884).
- ``lib/galaxy/schema/generics.py``: drop ``CustomJsonSchema`` here
  (moved to fast_app.py so it can use the patched ``GenerateJsonSchema``
  from ``_compat.v2``).
- ``lib/galaxy/webapps/galaxy/fast_app.py``: relocate
  ``CustomJsonSchema`` and switch its base to the ``_compat.v2``
  ``GenerateJsonSchema``; replace the @app.middleware("http") X-Frame
  Options handler with a pure ASGI ``XFrameOptionsMiddleware`` class
  (dev commit 67eea395ab) since ``BaseHTTPMiddleware`` semantics
  changed in starlette 1.0.
- ``lib/galaxy/webapps/base/api.py`` and
  ``lib/galaxy/webapps/galaxy/api/datasets.py``: drop the ``method``
  argument of ``FileResponse`` which starlette 1.0 removed (dev commit
  63954cb42e).

Also bumps the minimum FastAPI requirement to ``>=0.133.0`` (first
version compatible with starlette>=1.0.0) and adds an explicit
``starlette>=1.0.1`` floor in ``pyproject.toml`` and the
``packages/web_apps`` / ``packages/tool_shed`` setup.cfg files so
source installs cannot resolve to a vulnerable combo.

Co-authored-by: Nicola Soranzo <nicola.soranzo@gmail.com>
2026-05-28 18:56:59 +02:00
Marius van den Beek cb36b7065a Merge pull request #22617 from mvdbeek/reject-nonsense-id
[26.0] Reject malformed dataset ids in data tool parameter
2026-05-22 09:05:26 +02:00
John Chilton 5132e10bde Merge pull request #22603 from mvdbeek/access-check-fix
[26.0] Fix job access check for collection-only outputs
2026-05-21 20:38:55 -04:00
Marius van den Beek 4826f9768c Merge pull request #22724 from mvdbeek/fix-datamanager-leaking-hda
[26.0] Fix HDA leak in tool form for data managers (#22674)
2026-05-21 09:33:50 +02:00
Marius van den Beek 2bda1168f0 Merge pull request #22604 from davelopez/26.0/fix_forum_error_handling
[26.0] Fix error handling for Help Forum integration
2026-05-20 20:01:38 +02:00
David LópezandMarius van den Beek 68a5318853 Remove redundant exception logs
Co-authored-by: Marius van den Beek <m.vandenbeek@gmail.com>
2026-05-20 17:24:23 +02:00
Marius van den Beek 24be98d6d5 Merge pull request #22660 from guerler/vintent.001
[26.0] Update Vintent
2026-05-20 17:02:51 +02:00
mvdbeek abe404539e Pass child context to Repeat sub-inputs in get_initial_value
``Repeat.get_initial_value`` passed the parent ``context`` directly to
each child input's ``get_initial_value``, so siblings within a repeat
instance were invisible to each other's ``dynamic_options`` lookups.
``Section`` and ``Conditional`` already wrap their partial ``rval`` in
a child ``ExpressionContext`` for this reason — bring ``Repeat`` in
line.

Surfaced by ``data_manager_manual`` (``min=1`` on both the outer
``data_tables`` repeat and the inner ``columns`` repeat). The inner
``data_table_column_name`` select declares::

    dynamic_options="galaxy_code_get_available_data_table_columns(
        __trans__, data_table_name)"

During the initial ``populate_state`` pass ``Repeat.get_initial_value``
built the default ``data_tables`` instance with the outer
``rval_dict`` only visible as a local variable; the recursive
``columns.get_initial_value`` call therefore saw a context that did
not contain ``data_table_name`` and the eval raised::

    NameError: name 'data_table_name' is not defined

The error is caught at ``basic.py`` (logged at DEBUG, options returned
as ``[]``) and the default instance is later discarded by
``_populate_state_legacy`` which rebuilds the state with a proper
child context — so the tool ran fine, but every form build polluted
the log.
2026-05-20 16:50:34 +02:00
mvdbeek 56417baef9 Fix HDA leak in tool form for data managers (#22674)
When a user already has a ``data_manager_json`` bundle in their history
for a given tool data table, ``DynamicOptions.get_user_options`` builds
a synthetic options row from that bundle.

A 2025-02-18 refactor (172ef05f26, "Skip bundles that don't match data
table definition") moved ``field_entry.append(hda)`` from the end of the
row-building loop to the beginning. That shifted every declared column
index by one and put the HDA at position 0. ``get_options`` then reads
``fields[self.columns[<col>]]`` to find the option's name / value and
expects the HDA at ``fields[-1]`` — so it ends up wiring the raw HDA
into the option's ``value`` field. The unserialized HDA then crashed
``/api/tools/{id}/build`` for the data manager's own form with:

  TypeError: Object of type HistoryDatasetAssociation is not JSON serializable

Move the HDA append back after the column loop where get_options
expects it.

Regression covered by a new API test in a ``require_admin_user=True``
test class that runs ``data_manager_select`` in bundle mode to produce a
real ``data_manager_json`` bundle, then calls the build endpoint and
asserts the synthetic option is present.
2026-05-20 09:01:49 +02:00
Marius van den Beek 7ec1595b67 Merge pull request #22552 from mvdbeek/collection-not-replaced
[26.0] Raise ToolInputsNotReady for unpopulated structured_like target
2026-05-20 08:42:10 +02:00
Marius van den Beek 62a0b20ec1 Merge pull request #22683 from davelopez/26.0_fix_webdav_downloads
[26.0] Fix webdav file download
2026-05-20 08:27:12 +02:00
mvdbeek 50fd6d3a10 Rename test tool to describe shape, not test scenario
Per review: the tool itself has a data input and a paired collection
input with structured_like output -- it doesn't do mapping-over.
Mapping-over is what the regression test does.
2026-05-19 19:50:56 +02:00
Björn Grüning 320c538a68 Merge pull request #22720 from mvdbeek/fix-datasource-redirect
[26.0] Fix data source tool redirect back to Galaxy SPA
2026-05-19 17:12:14 +02:00
Björn Grüning 204771e1fb Merge pull request #22718 from bgruening/add_tei
[26.0] add TEI XML datatype
2026-05-19 13:25:03 +02:00
mvdbeek 26b51d3662 Fix data source tool redirect back to Galaxy SPA
The mako-template removal in 76341658dc deleted the JavaScript
`top.location.href = '/'` redirect that returned the user to Galaxy
after an external data source import in a new tab. The replacement
`show_ok_message` rendered a static page, leaving the new tab
stranded on a "job queued" message instead of navigating back to the
SPA.

Restore the redirect with a 302 to `/?notification=tool-submitted`
from both `ToolRunner.index` and `ASync.index`, and have `Home.vue`
surface a `useToast` notification on landing (then strip the query
param so a reload doesn't re-fire it).

Fixes #22671
2026-05-19 11:33:11 +02:00
Bjoern Gruening a76774f93f remove copy&paste 2026-05-18 21:25:36 +02:00
Bjoern Gruening 30e2b9e04b add TEI XML datatype 2026-05-18 21:23:32 +02:00
Marius van den Beek 9d3f8cea45 Merge pull request #22664 from mvdbeek/fix-rerun-validation
[26.0] Fix workflow rerun for unset optional data inputs
2026-05-18 20:29:10 +02:00
mvdbeek 394aac4fa9 Add selenium regression test for unset optional data input rerun
Selenium regression for the WorkflowRunFormSimple data-input rerun
hydration crash fixed in the prior commit. Runs
`WORKFLOW_OPTIONAL_TRUE_INPUT_DATA` (a single optional `data_input`)
without selecting a dataset, then reruns without changes and asserts a
new ok output appears.

Pre-fix, the rerun submission raised a "Workflow submission failed:
... 'values' not permitted ..." toast because the rerun-hydrated
wrapper contained `[null]` (left over from the optional input the
user didn't fill on the original run) and `FormData.vue`'s mounted
hook crashed on `"src" in null` before it could normalize the value.
Originally reported on a "1 or 2 haplotypes" workflow where users
left the second-haplotype input empty.
2026-05-18 17:12:31 +02:00
John Chilton 27705e605b Merge pull request #22693 from ahmedhamidawan/fix_wf_editor_opens_old_link
[26.0] Ensure workflow editor always inserts latest tool version
2026-05-16 12:16:35 -04:00
David López aa7f886456 Merge pull request #22690 from davelopez/26.0_fix_invenio_zenodo_browsing
[26.0] Fix Zenodo/Invenio browsing of own records
2026-05-15 09:41:03 +02:00
Ahmed AwanandClaude db8544fd96 add unit tests for tool_version="latest" resolution in ToolModule.from_dict
Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-14 16:05:09 -05:00
Ahmed Awan a200cd14b4 [26.0] Ensure workflow editor always inserts latest tool version
This is done by passing `tool_version: latest` to `POST api/workflows/build_module`, which is then on the backend resolved by removing the version from the tool's GUID, unless we explicitly pass a `tool_uuid` (for UDTs for e.g.).

Fixes https://github.com/galaxyproject/galaxy/issues/22646
2026-05-14 15:57:34 -05:00