Пример #1
0
    def create_missing_perms(self) -> None:
        """
        Creates missing FAB permissions for datasources, schemas and metrics.
        """

        # pylint: disable=import-outside-toplevel
        from superset.models import core as models

        logger.info(
            "Fetching a set of all perms to lookup which ones are missing")
        all_pvs = set()
        for pv in self.get_session.query(self.permissionview_model).all():
            if pv.permission and pv.view_menu:
                all_pvs.add((pv.permission.name, pv.view_menu.name))

        def merge_pv(view_menu: str, perm: str) -> None:
            """Create permission view menu only if it doesn't exist"""
            if view_menu and perm and (view_menu, perm) not in all_pvs:
                self.add_permission_view_menu(view_menu, perm)

        logger.info("Creating missing datasource permissions.")
        datasources = ConnectorRegistry.get_all_datasources(self.get_session)
        for datasource in datasources:
            merge_pv("datasource_access", datasource.get_perm())
            merge_pv("schema_access", datasource.get_schema_perm())

        logger.info("Creating missing database permissions.")
        databases = self.get_session.query(models.Database).all()
        for database in databases:
            merge_pv("database_access", database.perm)
Пример #2
0
    def create_missing_perms(self) -> None:
        """
        Creates missing FAB permissions for datasources, schemas and metrics.
        """

        from superset import db
        from superset.connectors.base.models import BaseMetric
        from superset.models import core as models

        logging.info("Fetching a set of all perms to lookup which ones are missing")
        all_pvs = set()
        for pv in self.get_session.query(self.permissionview_model).all():
            if pv.permission and pv.view_menu:
                all_pvs.add((pv.permission.name, pv.view_menu.name))

        def merge_pv(view_menu, perm):
            """Create permission view menu only if it doesn't exist"""
            if view_menu and perm and (view_menu, perm) not in all_pvs:
                self.add_permission_view_menu(view_menu, perm)

        logging.info("Creating missing datasource permissions.")
        datasources = ConnectorRegistry.get_all_datasources(db.session)
        for datasource in datasources:
            merge_pv("datasource_access", datasource.get_perm())
            merge_pv("schema_access", datasource.schema_perm)

        logging.info("Creating missing database permissions.")
        databases = db.session.query(models.Database).all()
        for database in databases:
            merge_pv("database_access", database.perm)

        logging.info("Creating missing metrics permissions")
        metrics: List[BaseMetric] = []
        for datasource_class in ConnectorRegistry.sources.values():
            metrics += list(db.session.query(datasource_class.metric_class).all())
Пример #3
0
    def get_user_datasources(self) -> List["BaseDatasource"]:
        """
        Collect datasources which the user has explicit permissions to.

        :returns: The list of datasources
        """

        user_perms = self.user_view_menu_names("datasource_access")
        schema_perms = self.user_view_menu_names("schema_access")
        user_datasources = set()
        for datasource_class in ConnectorRegistry.sources.values():
            user_datasources.update(
                self.get_session.query(datasource_class).filter(
                    or_(
                        datasource_class.perm.in_(user_perms),
                        datasource_class.schema_perm.in_(schema_perms),
                    )).all())

        # group all datasources by database
        all_datasources = ConnectorRegistry.get_all_datasources(
            self.get_session)
        datasources_by_database: Dict["Database",
                                      Set["BaseDatasource"]] = defaultdict(set)
        for datasource in all_datasources:
            datasources_by_database[datasource.database].add(datasource)

        # add datasources with implicit permission (eg, database access)
        for database, datasources in datasources_by_database.items():
            if self.can_access_database(database):
                user_datasources.update(datasources)

        return list(user_datasources)
Пример #4
0
def create_missing_perms():
    """Creates missing perms for datasources, schemas and metrics"""

    logging.info(
        'Fetching a set of all perms to lookup which ones are missing')
    all_pvs = set()
    for pv in sm.get_session.query(sm.permissionview_model).all():
        if pv.permission and pv.view_menu:
            all_pvs.add((pv.permission.name, pv.view_menu.name))

    def merge_pv(view_menu, perm):
        """Create permission view menu only if it doesn't exist"""
        if view_menu and perm and (view_menu, perm) not in all_pvs:
            merge_perm(sm, view_menu, perm)

    logging.info('Creating missing datasource permissions.')
    datasources = ConnectorRegistry.get_all_datasources(db.session)
    for datasource in datasources:
        merge_pv('datasource_access', datasource.get_perm())
        merge_pv('schema_access', datasource.schema_perm)

    logging.info('Creating missing database permissions.')
    databases = db.session.query(models.Database).all()
    for database in databases:
        merge_pv('database_access', database.perm)

    logging.info('Creating missing metrics permissions')
    metrics = []
    for datasource_class in ConnectorRegistry.sources.values():
        metrics += list(db.session.query(datasource_class.metric_class).all())

    for metric in metrics:
        if metric.is_restricted:
            merge_pv('metric_access', metric.perm)
Пример #5
0
def create_missing_perms():
    """Creates missing perms for datasources, schemas and metrics"""

    logging.info(
        "Fetching a set of all perms to lookup which ones are missing")
    all_pvs = set()
    for pv in sm.get_session.query(sm.permissionview_model).all():
        if pv.permission and pv.view_menu:
            all_pvs.add((pv.permission.name, pv.view_menu.name))

    def merge_pv(view_menu, perm):
        """Create permission view menu only if it doesn't exist"""
        if view_menu and perm and (view_menu, perm) not in all_pvs:
            merge_perm(sm, view_menu, perm)

    logging.info("Creating missing datasource permissions.")
    datasources = ConnectorRegistry.get_all_datasources(db.session)
    for datasource in datasources:
        merge_pv('datasource_access', datasource.get_perm())
        merge_pv('schema_access', datasource.schema_perm)

    logging.info("Creating missing database permissions.")
    databases = db.session.query(models.Database).all()
    for database in databases:
        merge_pv('database_access', database.perm)

    logging.info("Creating missing metrics permissions")
    metrics = []
    for datasource_class in ConnectorRegistry.sources.values():
        metrics += list(db.session.query(datasource_class.metric_class).all())

    for metric in metrics:
        if (metric.is_restricted):
            merge_pv('metric_access', metric.perm)
Пример #6
0
def create_missing_datasource_perms(view_menu_set):
    logging.info("Creating missing datasource permissions.")
    datasources = ConnectorRegistry.get_all_datasources(db.session)
    for datasource in datasources:
        if datasource and datasource.perm not in view_menu_set:
            merge_perm(sm, 'datasource_access', datasource.get_perm())
            if datasource.schema_perm:
                merge_perm(sm, 'schema_access', datasource.schema_perm)
Пример #7
0
def create_missing_datasource_perms(view_menu_set):
    logging.info("Creating missing datasource permissions.")
    datasources = ConnectorRegistry.get_all_datasources(
        db.session)
    for datasource in datasources:
        if datasource and datasource.perm not in view_menu_set:
            merge_perm(sm, 'datasource_access', datasource.get_perm())
            if datasource.schema_perm:
                merge_perm(sm, 'schema_access', datasource.schema_perm)
Пример #8
0
 def add(self) -> FlaskResponse:
     datasources = [{
         "value": str(d.id) + "__" + d.type,
         "label": repr(d)
     } for d in ConnectorRegistry.get_all_datasources(db.session)]
     payload = {
         "datasources": sorted(datasources, key=lambda d: d["label"]),
         "common": common_bootstrap_payload(),
     }
     return self.render_template("superset/add_slice.html",
                                 bootstrap_data=json.dumps(payload))
Пример #9
0
 def add(self) -> FlaskResponse:
     datasources = [{
         "value": str(d.id) + "__" + d.type,
         "label": repr(d)
     } for d in ConnectorRegistry.get_all_datasources()]
     return self.render_template(
         "superset/add_slice.html",
         bootstrap_data=json.dumps(
             {"datasources": sorted(datasources,
                                    key=lambda d: d["label"])}),
     )
Пример #10
0
 def fetch_all_datasources() -> List["BaseDatasource"]:
     return ConnectorRegistry.get_all_datasources(db.session)
Пример #11
0
    def add(self) -> FlaskResponse:
        allowed_datasources = []
        datasources = []

        # only if gamma
        is_gamma = False
        logging.debug('-------------------------')
        for role in g.user.roles:
            if str(role) == 'Gamma':
                is_gamma = True
            logging.debug(role.permissions)
            for perm in role.permissions:
                if str(perm).startswith('datasource access on ['):
                    #'datasource access on [DB].[DATASOURCE](id:ID)')
                    data_search = re.search(
                        'datasource access on \[([^\]]+)\]\.\[([^\]]+)\]\(id:([^\)]+)\)',
                        str(perm))
                    if data_search:
                        allowed_datasources.append({
                            "connection":
                            data_search.group(1),
                            "name":
                            data_search.group(2),
                            "id":
                            data_search.group(3)
                        })
        for d in ConnectorRegistry.get_all_datasources(db.session):
            if (is_gamma):
                for a in allowed_datasources:
                    table_name = d.short_data.get("name").split('.')[-1]
                    if table_name == a.get("name") and d.short_data.get(
                            "connection") == a.get("connection") and str(
                                d.short_data.get("id")) == str(a.get("id")):
                        if hasattr(d, 'custom_label'):
                            datasources.append({
                                "value": str(d.id) + "__" + d.type,
                                "label": d.custom_label
                            })
                        else:
                            datasources.append({
                                "value": str(d.id) + "__" + d.type,
                                "label": repr(d)
                            })
            else:
                if hasattr(d, 'custom_label'):
                    datasources.append({
                        "value": str(d.id) + "__" + d.type,
                        "label": d.custom_label
                    })
                else:
                    datasources.append({
                        "value": str(d.id) + "__" + d.type,
                        "label": repr(d)
                    })
        payload = {
            "datasources": sorted(datasources, key=lambda d: d["label"]),
            "common": common_bootstrap_payload(),
            "user": bootstrap_user_data(g.user),
        }
        return self.render_template("superset/add_slice.html",
                                    bootstrap_data=json.dumps(payload))