Unverified Commit f38461bd authored by Marius van den Beek's avatar Marius van den Beek Committed by GitHub
Browse files

Merge pull request #18333 from davelopez/24.0_fix_500_for_anonymous_job_listing

[24.0] Fix authentication error for anonymous users querying jobs
parents 62eadc87 7caee0b7
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
import json
import logging
import typing
from datetime import (
    date,
    datetime,
)
from typing import (
    Dict,
    Optional,
)

import sqlalchemy
from boltons.iterutils import remap
@@ -37,6 +40,7 @@ from galaxy.job_metrics import (
    Safety,
)
from galaxy.managers.collections import DatasetCollectionManager
from galaxy.managers.context import ProvidesUserContext
from galaxy.managers.datasets import DatasetManager
from galaxy.managers.hdas import HDAManager
from galaxy.managers.lddas import LDDAManager
@@ -105,7 +109,9 @@ class JobManager:
        self.app = app
        self.dataset_manager = DatasetManager(app)

    def index_query(self, trans, payload: JobIndexQueryPayload) -> sqlalchemy.engine.Result:
    def index_query(
        self, trans: ProvidesUserContext, payload: JobIndexQueryPayload
    ) -> Optional[sqlalchemy.engine.Result]:
        """The caller is responsible for security checks on the resulting job if
        history_id, invocation_id, or implicit_collection_jobs_id is set.
        Otherwise this will only return the user's jobs or all jobs if the requesting
@@ -121,6 +127,13 @@ class JobManager:
        search = payload.search
        order_by = payload.order_by

        if trans.user is None:
            # If the user is anonymous we can only return jobs for the current session history
            if trans.galaxy_session and trans.galaxy_session.current_history_id:
                history_id = trans.galaxy_session.current_history_id
            else:
                return None

        def build_and_apply_filters(stmt, objects, filter_func):
            if objects is not None:
                if isinstance(objects, (str, date, datetime)):
@@ -207,7 +220,7 @@ class JobManager:
            if user_details:
                stmt = stmt.outerjoin(Job.user)
        else:
            if history_id is None and invocation_id is None and implicit_collection_jobs_id is None:
            if history_id is None and invocation_id is None and implicit_collection_jobs_id is None and trans.user:
                stmt = stmt.where(Job.user_id == trans.user.id)
            # caller better check security

@@ -630,7 +643,7 @@ class JobSearch:
        return None


def view_show_job(trans, job: Job, full: bool) -> typing.Dict:
def view_show_job(trans, job: Job, full: bool) -> Dict:
    is_admin = trans.user_is_admin
    job_dict = job.to_dict("element", system_details=is_admin)
    if trans.app.config.expose_dataset_path and "command_line" not in job_dict:
+3 −1
Original line number Diff line number Diff line
@@ -81,7 +81,9 @@ class JobsService(ServiceBase):
            or payload.history_id is not None
        )
        jobs = self.job_manager.index_query(trans, payload)
        out = []
        out: List[Dict[str, Any]] = []
        if jobs is None:
            return out
        for job in jobs.yield_per(model.YIELD_PER_ROWS):
            # TODO: optimize if this crucial
            if check_security_of_jobs and not security_check(trans, job.history, check_accessible=True):