Пример #1
0
 def __init__(self, headless=True):
     self.web_page = '/vivagraph/simple.html'
     self.web_root = Files.path_combine(Files.parent_folder(__file__),
                                        '../web_root')
     self.api_browser = API_Browser(headless=headless).sync__setup_browser()
     self.web_server = Web_Server(self.web_root)
     self.render_page = Render_Page(api_browser=self.api_browser,
                                    web_server=self.web_server)
Пример #2
0
 def __init__(self,
              api_browser=None,
              headless=True,
              web_root=None,
              web_server=None):
     if web_server:
         self.web_server = web_server
     else:
         self.web_server = Web_Server(web_root)
     if api_browser:
         self.api_browser = api_browser
     else:
         self.api_browser = API_Browser(headless=headless)
Пример #3
0
 def create_graph_and_send_screenshot_to_slack(self,
                                               nodes,
                                               edges,
                                               graph_name=None,
                                               screenshot=True,
                                               team_id=None,
                                               channel=None):
     with Web_Server(
             self.web_root) as web_server:  # handle server start and stop
         self.web_server = web_server
         try:
             message = f":point_right: Creating `{graph_name}` using VivaGraph JS engine with: *nodes* `{len(nodes)}` *edges* `{len(edges)}` *width* `{self.browser_width}` and *render_wait* `{self.render_wait}`\n"
             slack_message(message, [], channel, team_id)
             #slack_message(f':point_right: Creating graph in viva_graph with {len(nodes)} nodes', [], channel)
             self.create_graph(nodes, edges)
             #slack_message(f':point_right: Created graph in viva_graph with {len(nodes)} nodes', [], channel)
             if screenshot:
                 self.calculate_browser_width_and_wait(nodes)
                 png_data = self.send_screenshot_to_slack(team_id, channel)
                 return png_data
             else:
                 return self
         except Exception as error:
             message = f':red_circle: error in create_graph_and_send_screenshot_to_slack :{error}'
             return slack_message(message, [], channel)
Пример #4
0
 async def test_screenshot_jira(self):
     chrome = Chrome()
     browser = await chrome.browser()
     page = (await browser.pages()).pop()
     with Web_Server() as web_server:
         await page.goto(web_server.url())
         self.png_data = await page.screenshot()
Пример #5
0
 def __init__(self, web_page, headless=True):
     self.web_page = web_page
     self.title = 'browser view'
     self.web_root = Files.path_combine(Files.parent_folder(__file__),
                                        '../web_root')
     self.api_browser = API_Browser(headless=headless).sync__setup_browser()
     self.web_server = Web_Server(self.web_root)
     self.render_page = Render_Page(api_browser=self.api_browser,
                                    web_server=self.web_server)
Пример #6
0
class Render_Page:
    def __init__(self,
                 api_browser=None,
                 headless=True,
                 web_root=None,
                 web_server=None):
        if web_server:
            self.web_server = web_server
        else:
            self.web_server = Web_Server(web_root)
        if api_browser:
            self.api_browser = api_browser
        else:
            self.api_browser = API_Browser(headless=headless)

    def render_file(self, html_file):
        return self.render_html(Files.contents(html_file))

    def render_folder(self, web_root):
        with self.web_server.set_web_root(web_root):
            return self.get_page_html_via_browser(self.web_server.url())

    def render_html(self, html):
        temp_file = Web_Server_Temp_File(self.web_server, html)
        with self.web_server:
            with temp_file:
                result = self.get_page_html_via_browser(temp_file.url())
        return result

    def screenshot_html(self, html, img_file=None, clip=None):
        with self.web_server:
            with Web_Server_Temp_File(self.web_server, html) as temp_file:
                return self.get_screenshot_via_browser(temp_file.url(),
                                                       img_file,
                                                       clip=clip)

    def screenshot_file(self, html_file, img_file=None, clip=None):
        return self.screenshot_html(Files.contents(html_file), img_file, clip)

    def screenshot_folder(self, web_root, png_file=None, clip=None):
        with self.web_server.set_web_root(web_root):
            return self.get_screenshot_via_browser(png_file=png_file,
                                                   clip=clip)

    def screenshot_file_in_folder(self,
                                  web_root,
                                  html_file,
                                  png_file=None,
                                  clip=None):
        with self.web_server.set_web_root(web_root):
            url = self.web_server.url(html_file)
            return self.get_screenshot_via_browser(url=url,
                                                   png_file=png_file,
                                                   clip=clip)

    def screenshot_url(self, url, img_file, clip=None):
        return self.get_screenshot_via_browser(url, img_file, clip=clip)

    # Sync Helper method (to allow calls to the Async methods to feel like Sync calls)

    @sync
    async def get_page_html_via_browser(self, url, js_code=None):
        await self.api_browser.browser()  # make sure browser is connected
        await self.api_browser.open(url)  # open url
        await self.api_browser.js_execute(js_code)  # execute Javascript
        return await self.api_browser.html()  # return raw Html

    @sync
    async def get_screenshot_via_browser(self,
                                         url=None,
                                         png_file=None,
                                         full_page=True,
                                         clip=None,
                                         viewport=None,
                                         js_code=None,
                                         delay=None):
        if clip is not None: full_page = False
        if png_file is None: png_file = Files.temp_file('.png')
        if url is None: url = self.web_server.url()
        await self.api_browser.browser()
        return await self.api_browser.screenshot(url,
                                                 full_page=full_page,
                                                 file_screenshot=png_file,
                                                 clip=clip,
                                                 viewport=viewport,
                                                 js_code=js_code,
                                                 delay=delay)

    def open_file_in_browser(self, path, js_code=None):
        with self.web_server as web_server:
            url = web_server.url(path)
            return self.get_page_html_via_browser(url, js_code)
Пример #7
0
 def setUp(self):
     self.web_server = Web_Server()
     self.web_server.start()
Пример #8
0
class Test_Web_Server(TestCase):
    def setUp(self):
        self.web_server = Web_Server()
        self.web_server.start()

    def tearDown(self):
        self.web_server.stop()

    def test_path_to_file(self):
        assert self.web_server.path_to_file('') == '/tmp/temp_web_server/html'
        assert self.web_server.path_to_file(
            '/123456') == '/tmp/temp_web_server/html/123456'
        assert self.web_server.path_to_file(
            'bbbb.html') == '/tmp/temp_web_server/html/bbbb.html'
        assert self.web_server.path_to_file(
            'aaa/bbb/ccc.html') == '/tmp/temp_web_server/html/aaa/bbb/ccc.html'
        assert self.web_server.path_to_file(
            '../../abc.html'
        ) == '/tmp/abc.html'  # path traversal vulnerability
        assert self.web_server.path_to_file(
            '..\\..\\abc.html') == '/tmp/temp_web_server/html/..\\..\\abc.html'

    def test_start_server(self):
        html = self.web_server.html('')
        assert '</html>' in html
Пример #9
0
class VivaGraph_Js:
    def __init__(self, headless=True):
        self.web_page = '/vivagraph/simple.html'
        self.web_root = Files.path_combine(Files.parent_folder(__file__),
                                           '../web_root')
        self.api_browser = API_Browser(headless=headless).sync__setup_browser()
        self.web_server = Web_Server(self.web_root)
        self.render_page = Render_Page(api_browser=self.api_browser,
                                       web_server=self.web_server)

        # #self.base_html_file = '/vis-js/empty.html'
        # self.base_html_file = '/vis-js/simple.html'
        # #window.api_visjs
        # self.headless       = False
        # self.browser        = None

    # common methods (move to base class)
    def browser(self):
        return self.api_browser

    def browser_width(self, value):
        self.browser().sync__browser_width(value)
        return self

    def load_page(self, reload=False):
        if reload or self.web_page not in self.browser().sync__url():
            self.render_page.open_file_in_browser(self.web_page)
        return self

    def create_dashboard_screenshot(self):
        #clip = {'x': 1, 'y': 1, 'width': 945, 'height': 465}
        clip = None
        return self.browser().sync__screenshot(clip=clip)

    def send_screenshot_to_slack(self, team_id, channel):
        png_file = self.create_dashboard_screenshot()
        return Browser_Lamdba_Helper().send_png_file_to_slack(
            team_id, channel, 'risk dashboard', png_file)

    def get_graph_data(self, graph_name):
        params = {'params': ['raw_data', graph_name, 'details'], 'data': {}}
        data = Lambda('lambdas.gsbot.gsbot_graph').invoke(params)
        if type(data) is str:
            s3_key = data
            s3_bucket = 'gs-lambda-tests'
            tmp_file = S3().file_download_and_delete(s3_bucket, s3_key)
            data = Json.load_json_and_delete(tmp_file)
            return data
        return data

    def exec_js(self, js_code):
        return self.browser().sync__js_execute(js_code)

    def invoke_js(self, name, params):
        return self.browser().sync_js_invoke_function(name, params)

    def create_graph_and_send_screenshot_to_slack(self,
                                                  nodes,
                                                  edges,
                                                  options=None,
                                                  team_id=None,
                                                  channel=None):
        if len(nodes) > 0:
            self.create_graph(nodes, edges, options)
            if len(nodes) < 20: sleep(1)
            elif 20 < len(nodes) < 100:
                self.browser().sync__browser_width(1500)
                sleep(2)
            elif 100 < len(nodes) < 200:
                self.browser().sync__browser_width(2000)
                sleep(5)
            elif len(nodes) > 200:
                self.browser().sync__browser_width(3000)
                sleep(10)

            return self.send_screenshot_to_slack(team_id, channel)
            #self.create_graph(nodes, edges,options,graph_name)
            #return self.send_screenshot_to_slack(t§eam_id, channel)

    # main methods

    def create_graph(self, nodes, edges, options=None):
        self.web_server.start()
        url = self.web_server.url(self.web_page)

        self.render_page.get_page_html_via_browser(url)

        self.load_page(True)
        layout = {
            "springLength": 100,
            "springCoeff": 0.0008,
            "dragCoeff": 0.02,
            "gravity": -10.2
        }

        self.invoke_js("set_layout", layout)
        js_code = ""
        #for key,issue in nodes.items():
        for node in nodes:
            key = node.get('key')
            label = node.get('label')
            img_url = node.get('img_url')
            img_size = node.get('img_size')
            params = {"label": label, "img_url": img_url, 'img_size': img_size}
            js_code += 'graph.addNode("{0}",{1});'.format(
                key, Misc.json_dumps(params))
        for edge in edges:
            js_code += 'graph.addLink("{0}","{1}");\n'.format(edge[0], edge[2])
        js_code += "run_graph()"
        self.exec_js(js_code)
        self.web_server.stop()
        return 42

    def resolve_icon_from_issue_type(self, issue, key):
        label = key
        img_size = 20
        none_icon = 'icons/none.jpg'
        mappings = {
            'Risk': 'icons/risk_theme.svg',
            'Risk Theme': 'icons/risk_theme.svg',
            'Vulnerability': 'icons/vuln.png',
            'GS-Project': 'icons/gs_project.svg',
            'Business entity': 'icons/business_entity.svg',
            'GS Service ': 'icons/gs_service.svg',
            'IT Asset': 'icons/it_asset.svg',
            'IT System': 'icons/it_asset.svg',
            'People': 'icons/people.svg',
            'Programme': 'icons/programme.svg',
            'Threat Model': 'icons/threat_model.svg',
            'Key Result': 'icons/key-result.svg',
            'Objective': 'icons/objective.svg',
            'Task': 'icons/task.svg',
            'Epic': 'icons/epic.svg',
            'Data Journey': 'icons/data_journey.svg',
            'Project': 'icons/project.svg',
            'Fact': 'icons/fact.svg',
            'Incident': 'icons/incident.png',
            'Incident Task': 'icons/incident_task.png',
            'User Access': 'icons/user_access.svg',
            'Security Event': 'icons/security_event.svg',
        }

        if issue and issue.get("Issue Type"):
            issue_type = issue.get("Issue Type")
            icon = mappings.get(issue_type, none_icon)

            #if icon == none_icon:
            #    Dev.pprint(key + ' ' + issue_type)

        else:
            icon = 'icons/none.jpg'
            #icon = 'https://dummyimage.com/100x40/2c2f87/FFFFFF&text={0}'.format(key)
            #img_size = 10

        return label, img_size, icon