def GetExportedFlowResults(self, args, context=None):
     return api_flow.ApiGetExportedFlowResultsHandler()
示例#2
0
class TestFlowArchive(gui_test_lib.GRRSeleniumTest):
    def setUp(self):
        super(TestFlowArchive, self).setUp()

        self.client_id = self.SetupClient(0).Basename()
        self.RequestAndGrantClientApproval(self.client_id)
        self.action_mock = action_mocks.FileFinderClientMock()

    def testDoesNotShowGenerateArchiveButtonForNonExportableRDFValues(self):
        flow_test_lib.TestFlowHelper(
            gui_test_lib.FlowWithOneNetworkConnectionResult.__name__,
            self.action_mock,
            client_id=self.client_id,
            token=self.token)

        self.Open("/#/clients/%s" % self.client_id)
        self.Click("css=a[grrtarget='client.flows']")
        self.Click("css=td:contains('FlowWithOneNetworkConnectionResult')")
        self.Click("link=Results")

        self.WaitUntil(self.IsTextPresent, "42")
        self.WaitUntilNot(
            self.IsTextPresent,
            "Files referenced in this collection can be downloaded")

    def testDoesNotShowGenerateArchiveButtonWhenResultCollectionIsEmpty(self):
        flow_test_lib.TestFlowHelper(gui_test_lib.RecursiveTestFlow.__name__,
                                     self.action_mock,
                                     client_id=self.client_id,
                                     token=self.token)

        self.Open("/#/clients/%s" % self.client_id)
        self.Click("css=a[grrtarget='client.flows']")
        self.Click("css=td:contains('RecursiveTestFlow')")
        self.Click("link=Results")

        self.WaitUntil(self.IsTextPresent, "Value")
        self.WaitUntilNot(
            self.IsTextPresent,
            "Files referenced in this collection can be downloaded")

    def testShowsGenerateArchiveButtonForGetFileFlow(self):
        pathspec = rdf_paths.PathSpec(path=os.path.join(
            self.base_path, "test.plist"),
                                      pathtype=rdf_paths.PathSpec.PathType.OS)
        flow_test_lib.TestFlowHelper(flows_transfer.GetFile.__name__,
                                     self.action_mock,
                                     client_id=self.client_id,
                                     pathspec=pathspec,
                                     token=self.token)

        self.Open("/#/clients/%s" % self.client_id)
        self.Click("css=a[grrtarget='client.flows']")
        self.Click("css=td:contains('GetFile')")
        self.Click("link=Results")

        self.WaitUntil(
            self.IsTextPresent,
            "Files referenced in this collection can be downloaded")

    def testGenerateArchiveButtonGetsDisabledAfterClick(self):
        pathspec = rdf_paths.PathSpec(path=os.path.join(
            self.base_path, "test.plist"),
                                      pathtype=rdf_paths.PathSpec.PathType.OS)
        flow_test_lib.TestFlowHelper(flows_transfer.GetFile.__name__,
                                     self.action_mock,
                                     client_id=self.client_id,
                                     pathspec=pathspec,
                                     token=self.token)

        self.Open("/#/clients/%s" % self.client_id)
        self.Click("css=a[grrtarget='client.flows']")
        self.Click("css=td:contains('GetFile')")
        self.Click("link=Results")
        self.Click("css=button.DownloadButton")

        self.WaitUntil(self.IsElementPresent,
                       "css=button.DownloadButton[disabled]")
        self.WaitUntil(self.IsTextPresent, "Generation has started")

    def testShowsErrorMessageIfArchiveStreamingFailsBeforeFirstChunkIsSent(
            self):
        pathspec = rdf_paths.PathSpec(path=os.path.join(
            self.base_path, "test.plist"),
                                      pathtype=rdf_paths.PathSpec.PathType.OS)
        flow_urn = flow.StartFlow(flow_name=flows_transfer.GetFile.__name__,
                                  client_id=self.client_id,
                                  pathspec=pathspec,
                                  token=self.token)

        flow_test_lib.TestFlowHelper(flow_urn,
                                     self.action_mock,
                                     client_id=self.client_id,
                                     token=self.token)

        def RaisingStub(*unused_args, **unused_kwargs):
            raise RuntimeError("something went wrong")

        with utils.Stubber(api_call_handler_utils.CollectionArchiveGenerator,
                           "Generate", RaisingStub):
            self.Open("/#/clients/%s" % self.client_id)

            self.Click("css=a[grrtarget='client.flows']")
            self.Click("css=td:contains('GetFile')")
            self.Click("link=Results")
            self.Click("css=button.DownloadButton")
            self.WaitUntil(self.IsTextPresent,
                           "Can't generate archive: Unknown error")
            self.WaitUntil(
                self.IsUserNotificationPresent,
                "Archive generation failed for flow %s" % flow_urn.Basename())

    @mock.patch.object(
        api_call_router_with_approval_checks.ApiCallRouterWithApprovalChecks,
        "GetExportedFlowResults",
        return_value=api_flow.ApiGetExportedFlowResultsHandler())
    def testClickingOnDownloadAsCsvZipStartsDownload(self, mock_method):
        self.checkClickingOnDownloadAsStartsDownloadForType(
            mock_method, csv_plugin.CSVInstantOutputPlugin.plugin_name,
            csv_plugin.CSVInstantOutputPlugin.friendly_name)

    @mock.patch.object(
        api_call_router_with_approval_checks.ApiCallRouterWithApprovalChecks,
        "GetExportedFlowResults",
        return_value=api_flow.ApiGetExportedFlowResultsHandler())
    def testClickingOnDownloadAsYamlZipStartsDownload(self, mock_method):
        self.checkClickingOnDownloadAsStartsDownloadForType(
            mock_method, yaml_plugin.
            YamlInstantOutputPluginWithExportConversion.plugin_name,
            yaml_plugin.YamlInstantOutputPluginWithExportConversion.
            friendly_name)

    @mock.patch.object(
        api_call_router_with_approval_checks.ApiCallRouterWithApprovalChecks,
        "GetExportedFlowResults",
        return_value=api_flow.ApiGetExportedFlowResultsHandler())
    def testClickingOnDownloadAsSqliteZipStartsDownload(self, mock_method):
        self.checkClickingOnDownloadAsStartsDownloadForType(
            mock_method, sqlite_plugin.SqliteInstantOutputPlugin.plugin_name,
            sqlite_plugin.SqliteInstantOutputPlugin.friendly_name)

    def checkClickingOnDownloadAsStartsDownloadForType(self, mock_method,
                                                       plugin,
                                                       plugin_display_name):
        pathspec = rdf_paths.PathSpec(path=os.path.join(
            self.base_path, "test.plist"),
                                      pathtype=rdf_paths.PathSpec.PathType.OS)
        flow_urn = flow.StartFlow(flow_name=flows_transfer.GetFile.__name__,
                                  client_id=self.client_id,
                                  pathspec=pathspec,
                                  token=self.token)
        flow_test_lib.TestFlowHelper(flow_urn,
                                     self.action_mock,
                                     client_id=self.client_id,
                                     token=self.token)

        self.Open("/#/clients/%s/flows/%s" %
                  (self.client_id, flow_urn.Basename()))
        self.Click("link=Results")
        self.Select("id=plugin-select", plugin_display_name)
        self.Click("css=grr-download-collection-as button[name='download-as']")

        def MockMethodIsCalled():
            try:
                # Mock should be called twice: once for HEAD (to check permissions)
                # and once for GET methods.
                mock_method.assert_called_with(
                    api_flow.ApiGetExportedFlowResultsArgs(
                        client_id=self.client_id,
                        flow_id=flow_urn.Basename(),
                        plugin_name=plugin),
                    token=mock.ANY)

                return True
            except AssertionError:
                return False

        self.WaitUntil(MockMethodIsCalled)

    def testDoesNotShowDownloadAsPanelIfCollectionIsEmpty(self):
        flow_urn = flow.StartFlow(
            flow_name=gui_test_lib.RecursiveTestFlow.__name__,
            client_id=self.client_id,
            token=self.token)
        flow_test_lib.TestFlowHelper(flow_urn,
                                     self.action_mock,
                                     client_id=self.client_id,
                                     token=self.token)

        self.Open("/#/clients/%s/flows/%s" %
                  (self.client_id, flow_urn.Basename()))
        self.Click("link=Results")

        self.WaitUntil(self.IsTextPresent, "Value")
        self.WaitUntilNot(self.IsElementPresent, "grr-download-collection-as")
示例#3
0
    def setUp(self):
        super(ApiGetExportedFlowResultsHandlerTest, self).setUp()

        self.handler = flow_plugin.ApiGetExportedFlowResultsHandler()
        self.client_id = self.SetupClient(0)
示例#4
0
    def setUp(self):
        super().setUp()

        self.handler = flow_plugin.ApiGetExportedFlowResultsHandler()
        self.client_id = self.SetupClient(0)
        self.context = api_call_context.ApiCallContext("test")