Example #1
0
def test_unsaved_chart_unknown_dataset_id(mocker: MockFixture,
                                          app_context: AppContext) -> None:
    from superset.explore.utils import check_access

    with raises(DatasetNotFoundError):
        mocker.patch(dataset_find_by_id, return_value=None)
        check_access(dataset_id=1, chart_id=0, actor=User())
 def run(self) -> str:
     self.validate()
     try:
         dataset_id = self._cmd_params.dataset_id
         chart_id = self._cmd_params.chart_id
         tab_id = self._cmd_params.tab_id
         actor = self._cmd_params.actor
         form_data = self._cmd_params.form_data
         check_access(dataset_id, chart_id, actor)
         contextual_key = cache_key(session.get("_id"), tab_id, dataset_id,
                                    chart_id)
         key = cache_manager.explore_form_data_cache.get(contextual_key)
         if not key or not tab_id:
             key = random_key()
         if form_data:
             state: TemporaryExploreState = {
                 "owner": actor.get_user_id(),
                 "dataset_id": dataset_id,
                 "chart_id": chart_id,
                 "form_data": form_data,
             }
             cache_manager.explore_form_data_cache.set(key, state)
             cache_manager.explore_form_data_cache.set(contextual_key, key)
         return key
     except SQLAlchemyError as ex:
         logger.exception("Error running create command")
         raise TemporaryCacheCreateFailedError() from ex
Example #3
0
def test_unsaved_chart_authorized_dataset(mocker: MockFixture,
                                          app_context: AppContext) -> None:
    from superset.connectors.sqla.models import SqlaTable
    from superset.explore.utils import check_access

    mocker.patch(dataset_find_by_id, return_value=SqlaTable())
    mocker.patch(can_access_datasource, return_value=True)
    check_access(dataset_id=1, chart_id=0, actor=User())
Example #4
0
def test_saved_chart_unauthorized_dataset(mocker: MockFixture,
                                          app_context: AppContext) -> None:
    from superset.connectors.sqla.models import SqlaTable
    from superset.explore import utils

    with raises(DatasetAccessDeniedError):
        mocker.patch(dataset_find_by_id, return_value=SqlaTable())
        mocker.patch(can_access_datasource, return_value=False)
        utils.check_access(dataset_id=1, chart_id=1, actor=User())
Example #5
0
def test_saved_chart_unknown_chart_id(mocker: MockFixture,
                                      app_context: AppContext) -> None:
    from superset.connectors.sqla.models import SqlaTable
    from superset.explore.utils import check_access

    with raises(ChartNotFoundError):
        mocker.patch(dataset_find_by_id, return_value=SqlaTable())
        mocker.patch(can_access_datasource, return_value=True)
        mocker.patch(chart_find_by_id, return_value=None)
        check_access(dataset_id=1, chart_id=1, actor=User())
Example #6
0
def test_saved_chart_is_admin(mocker: MockFixture,
                              app_context: AppContext) -> None:
    from superset.connectors.sqla.models import SqlaTable
    from superset.explore.utils import check_access
    from superset.models.slice import Slice

    mocker.patch(dataset_find_by_id, return_value=SqlaTable())
    mocker.patch(can_access_datasource, return_value=True)
    mocker.patch(is_user_admin, return_value=True)
    mocker.patch(chart_find_by_id, return_value=Slice())
    check_access(dataset_id=1, chart_id=1, actor=User())
Example #7
0
 def run(self) -> Optional[str]:
     try:
         actor = self._cmd_params.actor
         key = self._cmd_params.key
         state: TemporaryExploreState = cache_manager.explore_form_data_cache.get(
             key)
         if state:
             check_access(state["dataset_id"], state["chart_id"], actor)
             if self._refresh_timeout:
                 cache_manager.explore_form_data_cache.set(key, state)
             return state["form_data"]
         return None
     except SQLAlchemyError as ex:
         logger.exception("Error running get command")
         raise TemporaryCacheGetFailedError() from ex
Example #8
0
 def run(self) -> bool:
     try:
         actor = self._cmd_params.actor
         key = self._cmd_params.key
         state: TemporaryExploreState = cache_manager.explore_form_data_cache.get(
             key)
         if state:
             dataset_id = state["dataset_id"]
             chart_id = state["chart_id"]
             check_access(dataset_id, chart_id, actor)
             if state["owner"] != actor.get_user_id():
                 raise TemporaryCacheAccessDeniedError()
             tab_id = self._cmd_params.tab_id
             contextual_key = cache_key(session.get("_id"), tab_id,
                                        dataset_id, chart_id)
             cache_manager.explore_form_data_cache.delete(contextual_key)
             return cache_manager.explore_form_data_cache.delete(key)
         return False
     except SQLAlchemyError as ex:
         logger.exception("Error running delete command")
         raise TemporaryCacheDeleteFailedError() from ex
 def run(self) -> str:
     self.validate()
     try:
         dataset_id = int(self.datasource.split("__")[0])
         check_access(dataset_id, self.chart_id, self.actor)
         value = {
             "chartId": self.chart_id,
             "datasetId": dataset_id,
             "datasource": self.datasource,
             "state": self.state,
         }
         command = CreateKeyValueCommand(
             actor=self.actor,
             resource=self.resource,
             value=value,
             key_type=self.key_type,
         )
         return command.run()
     except SQLAlchemyError as ex:
         logger.exception("Error running create command")
         raise ExplorePermalinkCreateFailedError() from ex
Example #10
0
 def run(self) -> Optional[ExplorePermalinkValue]:
     self.validate()
     try:
         value: Optional[ExplorePermalinkValue] = GetKeyValueCommand(
             resource=self.resource, key=self.key,
             key_type=self.key_type).run()
         if value:
             chart_id: Optional[int] = value.get("chartId")
             dataset_id = value["datasetId"]
             check_access(dataset_id, chart_id, self.actor)
             return value
         return None
     except (
             DatasetNotFoundError,
             KeyValueGetFailedError,
             KeyValueParseKeyError,
     ) as ex:
         raise ExplorePermalinkGetFailedError(message=ex.message) from ex
     except SQLAlchemyError as ex:
         logger.exception("Error running get command")
         raise ExplorePermalinkGetFailedError() from ex
    def run(self) -> Optional[str]:
        self.validate()
        try:
            dataset_id = self._cmd_params.dataset_id
            chart_id = self._cmd_params.chart_id
            actor = self._cmd_params.actor
            key = self._cmd_params.key
            form_data = self._cmd_params.form_data
            check_access(dataset_id, chart_id, actor)
            state: TemporaryExploreState = cache_manager.explore_form_data_cache.get(
                key
            )
            if state and form_data:
                user_id = actor.get_user_id()
                if state["owner"] != user_id:
                    raise TemporaryCacheAccessDeniedError()

                # Generate a new key if tab_id changes or equals 0
                tab_id = self._cmd_params.tab_id
                contextual_key = cache_key(
                    session.get("_id"), tab_id, dataset_id, chart_id
                )
                key = cache_manager.explore_form_data_cache.get(contextual_key)
                if not key or not tab_id:
                    key = random_key()
                    cache_manager.explore_form_data_cache.set(contextual_key, key)

                new_state: TemporaryExploreState = {
                    "owner": actor.get_user_id(),
                    "dataset_id": dataset_id,
                    "chart_id": chart_id,
                    "form_data": form_data,
                }
                cache_manager.explore_form_data_cache.set(key, new_state)
            return key
        except SQLAlchemyError as ex:
            logger.exception("Error running update command")
            raise TemporaryCacheUpdateFailedError() from ex
Example #12
0
 def run(self) -> str:
     self.validate()
     try:
         dataset_id = int(self.datasource.split("__")[0])
         check_access(dataset_id, self.chart_id, self.actor)
         value = {
             "chartId": self.chart_id,
             "datasetId": dataset_id,
             "datasource": self.datasource,
             "state": self.state,
         }
         command = CreateKeyValueCommand(
             actor=self.actor,
             resource=self.resource,
             value=value,
         )
         key = command.run()
         if key.id is None:
             raise ExplorePermalinkCreateFailedError("Unexpected missing key id")
         return encode_permalink_key(key=key.id, salt=self.salt)
     except SQLAlchemyError as ex:
         logger.exception("Error running create command")
         raise ExplorePermalinkCreateFailedError() from ex
Example #13
0
def test_unsaved_chart_no_dataset_id(app_context: AppContext) -> None:
    from superset.explore.utils import check_access

    with raises(DatasetNotFoundError):
        check_access(dataset_id=0, chart_id=0, actor=User())