From 3f7e77264f11c474f940cf346b7ad2e721c618db Mon Sep 17 00:00:00 2001 From: lanasalameh1 Date: Sun, 30 Jul 2023 14:01:09 +0300 Subject: [PATCH 1/3] split logic flows --- .../canvas_apps_collector.py | 2 +- src/powerpwn/powerdump/gui/gui.py | 6 ++- src/powerpwn/powerdump/gui/prep.py | 22 ++++++--- .../powerdump/gui/templates/base.html | 5 +- .../gui/templates/canvasapps_table.html | 2 +- .../gui/templates/connections_table.html | 2 +- .../gui/templates/logic_flows_table.html | 46 +++++++++++++++++++ .../gui/templates/resources_table.html | 2 +- src/powerpwn/powerdump/utils/model_loaders.py | 18 +++++++- 9 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 src/powerpwn/powerdump/gui/templates/logic_flows_table.html diff --git a/src/powerpwn/powerdump/collect/resources_collectors/canvas_apps_collector.py b/src/powerpwn/powerdump/collect/resources_collectors/canvas_apps_collector.py index c1d05e8..98161f2 100644 --- a/src/powerpwn/powerdump/collect/resources_collectors/canvas_apps_collector.py +++ b/src/powerpwn/powerdump/collect/resources_collectors/canvas_apps_collector.py @@ -81,7 +81,7 @@ def collect(self, session: requests.Session, environment_id: str) -> Generator[C entity_type=ResourceType.canvas_app, ) logger.info( - f"Found {total_widely_shared_canvas_apps} widely shared canvas apps out of {total_canvas_apps} canvas apps in environment {environment_id}" + f"Found {total_widely_shared_canvas_apps} widely shared applications out of {total_canvas_apps} canvas apps in environment {environment_id}" ) def resource_type(self) -> ResourceType: diff --git a/src/powerpwn/powerdump/gui/gui.py b/src/powerpwn/powerdump/gui/gui.py index deb669e..8d563d2 100644 --- a/src/powerpwn/powerdump/gui/gui.py +++ b/src/powerpwn/powerdump/gui/gui.py @@ -12,6 +12,7 @@ full_canvasapps_table_wrapper, full_connection_table_wrapper, full_connectors_table_wrapper, + full_logic_flows_table_wrapper, full_resources_table_wrapper, register_specs, ) @@ -26,8 +27,9 @@ def run(self, cache_path: str) -> None: app = Flask(__name__, template_folder=self.__get_template_full_path()) register_specs(app=app, cache_path=cache_path) app.route("/")(full_resources_table_wrapper(cache_path=cache_path)) - app.route("/connection")(full_connection_table_wrapper(cache_path=cache_path)) - app.route("/canvas_app/")(full_canvasapps_table_wrapper(cache_path)) + app.route("/credentials")(full_connection_table_wrapper(cache_path=cache_path)) + app.route("/automation")(full_logic_flows_table_wrapper(cache_path=cache_path)) + app.route("/app/")(full_canvasapps_table_wrapper(cache_path)) app.route("/connector/")(full_connectors_table_wrapper(cache_path)) app.route("//")(flt_connection_table_wrapper(cache_path=cache_path)) app.route("///")(flt_resource_wrapper(cache_path=cache_path)) diff --git a/src/powerpwn/powerdump/gui/prep.py b/src/powerpwn/powerdump/gui/prep.py index a730d8b..b03d11f 100644 --- a/src/powerpwn/powerdump/gui/prep.py +++ b/src/powerpwn/powerdump/gui/prep.py @@ -16,6 +16,7 @@ load_canvasapps, load_connections, load_connectors, + load_logic_flows, load_resources, map_connector_id_and_env_id_to_connection_ids, ) @@ -55,12 +56,19 @@ def full_resources_table(): def full_connection_table_wrapper(cache_path: str): def full_connection_table(): - connections = list(load_connections(cache_path=cache_path)) + connections = list(load_connections(cache_path=cache_path, with_logic_flows=False)) - return render_template("connections_table.html", title=f"{TOOL_NAME} - Connections", resources=connections) + return render_template("connections_table.html", title=f"{TOOL_NAME} - Credentials", resources=connections) return full_connection_table +def full_logic_flows_table_wrapper(cache_path: str): + def full_logic_flows_table(): + connections = list(load_logic_flows(cache_path=cache_path)) + + return render_template("logic_flows_table.html", title=f"{TOOL_NAME} - Automations", resources=connections) + + return full_logic_flows_table def flt_connection_table_wrapper(cache_path: str): def flt_connection_table(connector_id: str): @@ -75,7 +83,7 @@ def full_canvasapps_table_wrapper(cache_path: str): def full_canvasapp_table(): apps = list(load_canvasapps(cache_path=cache_path)) - return render_template("canvasapps_table.html", title=f"{TOOL_NAME} - Canvas Apps", resources=apps) + return render_template("canvasapps_table.html", title=f"{TOOL_NAME} - Applications", resources=apps) return full_canvasapp_table @@ -90,13 +98,13 @@ def full_connector_table(): def flt_resource_wrapper(cache_path: str): - def get_resource_page(resource_type: ResourceType, env_id: str, resource_id: str): + def get_resource_page(resource_type: str, env_id: str, resource_id: str): resource: Optional[ResourceEntityBase] = None - if resource_type == ResourceType.canvas_app: + if resource_type == "app": resource = get_canvasapp(cache_path, env_id, resource_id) - elif resource_type == ResourceType.connection: + elif resource_type in ("credentials", "automation"): resource = get_connection(cache_path, env_id, resource_id) - elif resource_type == ResourceType.connector: + elif resource_type == "connector": resource = get_connector(cache_path, env_id, resource_id) if resource: diff --git a/src/powerpwn/powerdump/gui/templates/base.html b/src/powerpwn/powerdump/gui/templates/base.html index f8d8cbc..d259024 100644 --- a/src/powerpwn/powerdump/gui/templates/base.html +++ b/src/powerpwn/powerdump/gui/templates/base.html @@ -13,8 +13,9 @@

{{ title }}

diff --git a/src/powerpwn/powerdump/gui/templates/canvasapps_table.html b/src/powerpwn/powerdump/gui/templates/canvasapps_table.html index b073fea..659c3ad 100644 --- a/src/powerpwn/powerdump/gui/templates/canvasapps_table.html +++ b/src/powerpwn/powerdump/gui/templates/canvasapps_table.html @@ -22,7 +22,7 @@ {{ canvasapp.created_at }} {{ canvasapp.last_modified_at }} Run - Raw + Raw {% endfor %} diff --git a/src/powerpwn/powerdump/gui/templates/connections_table.html b/src/powerpwn/powerdump/gui/templates/connections_table.html index 5612d37..788a583 100644 --- a/src/powerpwn/powerdump/gui/templates/connections_table.html +++ b/src/powerpwn/powerdump/gui/templates/connections_table.html @@ -28,7 +28,7 @@ {{ connection.created_by.email }} {{ connection.shareable }} Playground - Raw + Raw Dump {% endfor %} diff --git a/src/powerpwn/powerdump/gui/templates/logic_flows_table.html b/src/powerpwn/powerdump/gui/templates/logic_flows_table.html new file mode 100644 index 0000000..fa236f8 --- /dev/null +++ b/src/powerpwn/powerdump/gui/templates/logic_flows_table.html @@ -0,0 +1,46 @@ +{% extends "base.html" %} + +{% block content %} + + + + + + + + + + + + + + + + {% for connection in resources %} + + + + + + + + + + + + + + {% endfor %} + +
ConnectorConnectionEnvironment Is validLast modified atExpires atCreated byShareable
{{ connection.connection_id }}{{ connection.connector_id }}{{ connection.display_name }}{{ connection.environment_id }}{{ connection.is_valid }}{{ connection.last_modified_at }}{{ connection.expiration_time }}{{ connection.created_by.email }}{{ connection.shareable }}PlaygroundRaw
+{% endblock %} + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/src/powerpwn/powerdump/gui/templates/resources_table.html b/src/powerpwn/powerdump/gui/templates/resources_table.html index b6f6749..d0b99ee 100644 --- a/src/powerpwn/powerdump/gui/templates/resources_table.html +++ b/src/powerpwn/powerdump/gui/templates/resources_table.html @@ -23,7 +23,7 @@ {{ resource.created_by.email }} {{ resource.created_at }} {{ resource.last_modified_at }} - Raw + Raw {% endfor %} diff --git a/src/powerpwn/powerdump/utils/model_loaders.py b/src/powerpwn/powerdump/utils/model_loaders.py index 12adc4a..5a3421e 100644 --- a/src/powerpwn/powerdump/utils/model_loaders.py +++ b/src/powerpwn/powerdump/utils/model_loaders.py @@ -17,7 +17,7 @@ def load_resources(cache_path: str, env_id: Optional[str] = None) -> Generator[R yield from load_connectors(cache_path, env_id) -def load_connections(cache_path: str, env_id: Optional[str] = None) -> Generator[Connection, None, None]: +def load_connections(cache_path: str, env_id: Optional[str] = None, with_logic_flows: bool = True) -> Generator[Connection, None, None]: cache = pathlib.Path(entities_path(cache_path)) if env_id: connections = cache.glob(f"{env_id}/{ResourceType.connection}/*.json") @@ -28,8 +28,24 @@ def load_connections(cache_path: str, env_id: Optional[str] = None) -> Generator with open(connection_path, "r") as fp: raw_connection = json.load(fp) parsed_connection = Connection.parse_obj(raw_connection) + if parsed_connection.connector_id == "shared_logicflows" and not with_logic_flows: + continue yield parsed_connection +def load_logic_flows(cache_path: str, env_id: Optional[str] = None) -> Generator[Connection, None, None]: + cache = pathlib.Path(entities_path(cache_path)) + if env_id: + connections = cache.glob(f"{env_id}/{ResourceType.connection}/*.json") + else: + connections = cache.glob(f"*/{ResourceType.connection}/*.json") + for connection in connections: + connection_path = "/".join(list(connection.parts)) + with open(connection_path, "r") as fp: + raw_connection = json.load(fp) + parsed_connection = Connection.parse_obj(raw_connection) + if not parsed_connection.connector_id == "shared_logicflows": + continue + yield parsed_connection def load_canvasapps(cache_path: str, env_id: Optional[str] = None) -> Generator[CanvasApp, None, None]: cache = pathlib.Path(entities_path(cache_path)) From 71e58a2c1e77a322e260155305ccab185fcf65f6 Mon Sep 17 00:00:00 2001 From: lanasalameh1 Date: Sun, 30 Jul 2023 14:09:36 +0300 Subject: [PATCH 2/3] pr validations --- src/powerpwn/powerdump/gui/prep.py | 9 ++------- src/powerpwn/powerdump/utils/model_loaders.py | 2 ++ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/powerpwn/powerdump/gui/prep.py b/src/powerpwn/powerdump/gui/prep.py index b03d11f..dd268be 100644 --- a/src/powerpwn/powerdump/gui/prep.py +++ b/src/powerpwn/powerdump/gui/prep.py @@ -1,6 +1,4 @@ import json -import os -import pathlib from typing import Optional from flask import Flask, render_template @@ -8,7 +6,6 @@ from powerpwn.cli.const import TOOL_NAME from powerpwn.powerdump.collect.models.resource_entity_base import ResourceEntityBase -from powerpwn.powerdump.collect.resources_collectors.enums.resource_type import ResourceType from powerpwn.powerdump.utils.model_loaders import ( get_canvasapp, get_connection, @@ -62,6 +59,7 @@ def full_connection_table(): return full_connection_table + def full_logic_flows_table_wrapper(cache_path: str): def full_logic_flows_table(): connections = list(load_logic_flows(cache_path=cache_path)) @@ -70,6 +68,7 @@ def full_logic_flows_table(): return full_logic_flows_table + def flt_connection_table_wrapper(cache_path: str): def flt_connection_table(connector_id: str): connections = [conn for conn in load_connections(cache_path=cache_path) if conn.connector_id == connector_id] @@ -113,7 +112,3 @@ def get_resource_page(resource_type: str, env_id: str, resource_id: str): ) return get_resource_page - - -def __get_template_full_path(template_name: str) -> str: - return os.path.join(pathlib.Path(__file__).parent.resolve(), "templates", template_name) diff --git a/src/powerpwn/powerdump/utils/model_loaders.py b/src/powerpwn/powerdump/utils/model_loaders.py index 5a3421e..b8849f4 100644 --- a/src/powerpwn/powerdump/utils/model_loaders.py +++ b/src/powerpwn/powerdump/utils/model_loaders.py @@ -32,6 +32,7 @@ def load_connections(cache_path: str, env_id: Optional[str] = None, with_logic_f continue yield parsed_connection + def load_logic_flows(cache_path: str, env_id: Optional[str] = None) -> Generator[Connection, None, None]: cache = pathlib.Path(entities_path(cache_path)) if env_id: @@ -47,6 +48,7 @@ def load_logic_flows(cache_path: str, env_id: Optional[str] = None) -> Generator continue yield parsed_connection + def load_canvasapps(cache_path: str, env_id: Optional[str] = None) -> Generator[CanvasApp, None, None]: cache = pathlib.Path(entities_path(cache_path)) if env_id: From 1b7d3762d2db077e940828b966fb3cc26f9476cc Mon Sep 17 00:00:00 2001 From: lanasalameh1 Date: Sun, 30 Jul 2023 14:20:49 +0300 Subject: [PATCH 3/3] change cache default path --- .gitignore | 3 ++- src/powerpwn/powerdump/utils/const.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 3190eee..99adc89 100644 --- a/.gitignore +++ b/.gitignore @@ -147,4 +147,5 @@ cov.xml .DS_Store tokens.json -*.zip \ No newline at end of file +*.zip +.dump \ No newline at end of file diff --git a/src/powerpwn/powerdump/utils/const.py b/src/powerpwn/powerdump/utils/const.py index e668b8d..e954056 100644 --- a/src/powerpwn/powerdump/utils/const.py +++ b/src/powerpwn/powerdump/utils/const.py @@ -1,4 +1,4 @@ -CACHE_PATH = ".cache" +CACHE_PATH = ".dump" DATA_MODEL_FILE_EXTENSION = ".json" SPEC_JWT_NAME = "ApiHubBearerAuth" DATA_MODEL_VERSION = "0.0.1"