Example #1
0
    def _set_defaults(self):
        """
		Set any default values for widgets. Also load settings from the existing
		campaign if one was specified.
		"""
        calendar = self.gobjects['calendar_campaign_expiration']
        default_day = datetime.datetime.today() + datetime.timedelta(days=31)
        gui_utilities.gtk_calendar_set_pydate(calendar, default_day)

        if self.is_new_campaign:
            return
        campaign = self.application.get_graphql_campaign()

        # set entries
        self.gobjects['entry_campaign_name'].set_text(campaign['name'])
        self.gobjects['entry_validation_regex_username'].set_text(
            campaign['credentialRegexUsername'] or '')
        self.gobjects['entry_validation_regex_password'].set_text(
            campaign['credentialRegexPassword'] or '')
        self.gobjects['entry_validation_regex_mfa_token'].set_text(
            campaign['credentialRegexMfaToken'] or '')

        if campaign['description'] is not None:
            self.gobjects['entry_campaign_description'].set_text(
                campaign['description'])
        if campaign['campaignType'] is not None:
            combobox = self.gobjects['combobox_campaign_type']
            model = combobox.get_model()
            model_iter = gui_utilities.gtk_list_store_search(
                model, campaign['campaignType']['id'], column=0)
            if model_iter is not None:
                combobox.set_active_iter(model_iter)

        self.gobjects['checkbutton_alert_subscribe'].set_property(
            'active',
            self.application.rpc('campaign/alerts/is_subscribed',
                                 self.campaign_id))
        self.gobjects['checkbutton_reject_after_credentials'].set_property(
            'active', bool(campaign['maxCredentials']))

        if campaign['company'] is not None:
            self.gobjects['radiobutton_company_existing'].set_active(True)
            combobox = self.gobjects['combobox_company_existing']
            model = combobox.get_model()
            model_iter = gui_utilities.gtk_list_store_search(
                model, campaign['company']['id'], column=0)
            if model_iter is not None:
                combobox.set_active_iter(model_iter)

        if campaign['expiration'] is not None:
            expiration = utilities.datetime_utc_to_local(
                campaign['expiration'])
            self.gobjects['checkbutton_expire_campaign'].set_active(True)
            self._expiration_time.time = expiration.time()
            gui_utilities.gtk_calendar_set_pydate(
                self.gobjects['calendar_campaign_expiration'],
                expiration.date())
	def change_cwd(self, new_dir):
		"""
		Changes current working directory to given parameter.

		:param str new_dir: The directory to change the CWD to.
		:return: The absolute path of the new working directory if it was changed.
		:rtype: str
		"""
		if not self.path_mod.isabs(new_dir):
			new_dir = self.get_abspath(new_dir)
		if new_dir == self.cwd:
			return
		logger.debug("{} is trying to change current working directory to {}".format(self.location, new_dir))
		try:
			self._chdir(new_dir)
		except OSError:
			logger.warning("user does not have permissions to read {}".format(new_dir))
			gui_utilities.show_dialog_error(
				'Plugin Error',
				self.application.get_active_window(),
				"You do not have permissions to access {}.".format(new_dir)
			)
			return

		self._tv_model.clear()
		try:
			self.load_dirs(new_dir)
		except OSError:
			logger.warning("user does not have permissions to read {}".format(new_dir))
			if self.cwd:
				self.load_dirs(self.cwd)
				gui_utilities.show_dialog_error(
					'Plugin Error',
					self.application.get_active_window(),
					"You do not have permissions to access {}.".format(new_dir)
				)
			else:
				logger.warning(self.location + " has no current working directory, using the root directory")
				self.default_directory = self.root_directory
				self.change_cwd(self.default_directory)
			return

		self.cwd = new_dir
		# clear and rebuild the model
		self._wdcb_model.clear()
		self._wdcb_model.append((self.root_directory,))
		if self.default_directory != self.root_directory:
			self._wdcb_model.append((self.default_directory,))
		if new_dir not in self.wd_history and gui_utilities.gtk_list_store_search(self._wdcb_model, new_dir) is None:
			self.wd_history.appendleft(new_dir)
		for directory in self.wd_history:
			self._wdcb_model.append((directory,))
		active_iter = gui_utilities.gtk_list_store_search(self._wdcb_model, new_dir)
		self.wdcb_dropdown.set_active_iter(active_iter)
		return new_dir
Example #3
0
    def _set_defaults(self):
        """
		Set any default values for widgets. Also load settings from the existing
		campaign if one was specified.
		"""
        calendar = self.gobjects['calendar_campaign_expiration']
        default_day = datetime.datetime.today() + datetime.timedelta(days=31)
        gui_utilities.gtk_calendar_set_pydate(calendar, default_day)

        if self.campaign_id is None:
            return
        campaign = self.application.rpc.remote_table_row('campaigns',
                                                         self.campaign_id,
                                                         cache=True,
                                                         refresh=True)

        self.gobjects['entry_campaign_name'].set_text(campaign.name)
        if campaign.description is not None:
            self.gobjects['entry_campaign_description'].set_text(
                campaign.description)
        if campaign.campaign_type_id is not None:
            combobox = self.gobjects['combobox_campaign_type']
            model = combobox.get_model()
            model_iter = gui_utilities.gtk_list_store_search(
                model, campaign.campaign_type_id, column=0)
            if model_iter is not None:
                combobox.set_active_iter(model_iter)

        self.gobjects['checkbutton_alert_subscribe'].set_property(
            'active',
            self.application.rpc('campaign/alerts/is_subscribed',
                                 self.campaign_id))
        self.gobjects['checkbutton_reject_after_credentials'].set_property(
            'active', campaign.reject_after_credentials)

        if campaign.company_id is not None:
            self.gobjects['radiobutton_company_existing'].set_active(True)
            combobox = self.gobjects['combobox_company_existing']
            model = combobox.get_model()
            model_iter = gui_utilities.gtk_list_store_search(
                model, campaign.company_id, column=0)
            if model_iter is not None:
                combobox.set_active_iter(model_iter)

        if campaign.expiration is not None:
            expiration = utilities.datetime_utc_to_local(campaign.expiration)
            self.gobjects['checkbutton_expire_campaign'].set_active(True)
            gui_utilities.gtk_calendar_set_pydate(
                self.gobjects['calendar_campaign_expiration'], expiration)
            self.gobjects['spinbutton_campaign_expiration_hour'].set_value(
                expiration.hour)
            self.gobjects['spinbutton_campaign_expiration_minute'].set_value(
                expiration.minute)
    def test_gtk_list_store_search(self):
        store = make_test_list_store()
        result = gui_utilities.gtk_list_store_search(store, 'row0 col0', 0)
        self.assertIsInstance(result, Gtk.TreeIter)
        self.assertEqual(store.get_path(result).to_string(), '0')

        result = gui_utilities.gtk_list_store_search(store, 'row1 col1', 1)
        self.assertIsInstance(result, Gtk.TreeIter)
        self.assertEqual(store.get_path(result).to_string(), '1')

        result = gui_utilities.gtk_list_store_search(store, 'fake', 0)
        self.assertIsNone(result)
	def test_gtk_list_store_search(self):
		store = make_test_list_store()
		result = gui_utilities.gtk_list_store_search(store, 'row0 col0', 0)
		self.assertIsInstance(result, Gtk.TreeIter)
		self.assertEqual(store.get_path(result).to_string(), '0')

		result = gui_utilities.gtk_list_store_search(store, 'row1 col1', 1)
		self.assertIsInstance(result, Gtk.TreeIter)
		self.assertEqual(store.get_path(result).to_string(), '1')

		result = gui_utilities.gtk_list_store_search(store, 'fake', 0)
		self.assertIsNone(result)
Example #6
0
 def signal_server_event_db(self, _, event_type, rows):
     get_node = lambda id: self.rpc.graphql(self.node_query,
                                            {'id': str(id)})['db']['node']
     for row in rows:
         if str(row.campaign_id) != self.config['campaign_id']:
             continue
         model = self.gobjects['treeview_campaign'].get_model()
         for case in utilities.switch(event_type):
             if case('inserted'):
                 row_data = self.format_node_data(get_node(row.id))
                 row_data = list(map(self.format_cell_data, row_data))
                 row_data.insert(0, str(row.id))
                 gui_utilities.glib_idle_add_wait(model.append, row_data)
             ti = gui_utilities.gtk_list_store_search(model, str(row.id))
             if ti is None:
                 self.logger.warning(
                     "received server db event: {0} for non-existent row {1}:{2}"
                     .format(event_type, self.table_name, str(row.id)))
                 break
             if case('deleted'):
                 model.remove(ti)
                 break
             if case('updated'):
                 row_data = self.format_node_data(get_node(row.id))
                 for idx, cell_data in enumerate(row_data, 1):
                     model[ti][idx] = self.format_cell_data(cell_data)
                 break
Example #7
0
	def _get_company_new_id(self):
		name = self.gobjects['entry_company_name'].get_text()
		name = name.strip()
		# check if this company name already exists in the model
		model = self.gobjects['combobox_company_existing'].get_model()
		model_iter = gui_utilities.gtk_list_store_search(model, name, column=1)
		if model_iter is not None:
			return model.get_value(model_iter, 0)
		# check if this company name already exists remotely
		remote_company = self._get_graphql_company(name)
		if remote_company:
			return remote_company['id']

		company_id = self.application.rpc(
			'db/table/insert',
			'companies',
			('name', 'description', 'industry_id', 'url_main', 'url_email', 'url_remote_access'),
			(
				name,
				self.get_entry_value('company_description'),
				self._get_tag_from_combobox(self.gobjects['combobox_company_industry'], 'industries'),
				self.get_entry_value('company_url_main'),
				self.get_entry_value('company_url_email'),
				self.get_entry_value('company_url_remote_access')
			)
		)
		self.gobjects['radiobutton_company_existing'].set_active(True)
		return company_id
Example #8
0
    def _get_company_info(self, company_id):
        company = self.application.rpc.graphql(
            """\
		query getCompany($id: String!) {
			db {
				company(id: $id) {
					id
					description
					name
					industryId
					urlMain
					urlEmail
					urlRemoteAccess
				}
			}
		}""", {'id': company_id})['db']['company']
        combobox = self.gobjects['combobox_company_industry']
        if company['industryId'] is None:
            combobox.set_active_iter(None)
            combobox.get_child().set_text('')
        else:
            combobox.set_active_iter(
                gui_utilities.gtk_list_store_search(combobox.get_model(),
                                                    company['industryId']))
        self.gobjects['entry_company_name'].set_text(company['name'])
        self.gobjects['entry_company_description'].set_text(
            company['description'] or '')
        self.gobjects['entry_company_url_main'].set_text(company['urlMain']
                                                         or '')
        self.gobjects['entry_company_url_email'].set_text(company['urlEmail']
                                                          or '')
        self.gobjects['entry_company_url_remote_access'].set_text(
            company['urlRemoteAccess'] or '')
Example #9
0
    def _get_company_new_id(self):
        name = self.gobjects['entry_company_new_name'].get_text()
        name = name.strip()
        # check if this company name already exists in the model
        model = self.gobjects['combobox_company_existing'].get_model()
        model_iter = gui_utilities.gtk_list_store_search(model, name, column=1)
        if model_iter is not None:
            return model.get_value(model_iter, 0)
        # check if this company name already exists remotely
        remote_companies = list(
            self.application.rpc.remote_table('companies',
                                              query_filter={'name': name}))
        if len(remote_companies):
            return remote_companies[0].id

        description = self.gobjects['entry_company_new_description'].get_text()
        description = description.strip()
        if description == '':
            description = None
        industry_id = self._get_tag_from_combobox(
            self.gobjects['combobox_company_industry'], 'industries')
        company_id = self.application.rpc(
            'db/table/insert', 'companies',
            ('name', 'description', 'industry_id'),
            (name, description, industry_id))
        self.gobjects['radiobutton_company_existing'].set_active(True)
        return company_id
    def __init__(self, *args, **kwargs):
        super(CompanyEditorDialog, self).__init__(*args, **kwargs)
        self._company_info_changed = False
        self._last_company_id = None
        self._set_comboboxes()
        self.gobjects['combobox_company_industry'].connect(
            'changed', self.signal_editable_changed)
        self.gobjects['entry_company_industry'].connect(
            'changed', self.signal_editable_changed)
        self.gobjects['entry_company_name'].connect(
            'changed', self.signal_editable_changed)
        self.gobjects['entry_company_description'].connect(
            'changed', self.signal_editable_changed)
        self.gobjects['entry_company_url_main'].connect(
            'changed', self.signal_editable_changed)
        self.gobjects['entry_company_url_email'].connect(
            'changed', self.signal_editable_changed)
        self.gobjects['entry_company_url_remote_access'].connect(
            'changed', self.signal_editable_changed)

        campaign = self.application.rpc.graphql_find_file(
            'get_campaign.graphql',
            id=self.config['campaign_id'])['db']['campaign']
        if campaign['company'] is not None:
            combobox = self.gobjects['combobox_company_existing']
            combobox.set_active_iter(
                gui_utilities.gtk_list_store_search(
                    combobox.get_model(), str(campaign['company']['id'])))
            self._get_company_info(campaign['company']['id'])
Example #11
0
	def _get_company_new_id(self):
		name = self.gobjects['entry_company_name'].get_text()
		name = name.strip()
		# check if this company name already exists in the model
		model = self.gobjects['combobox_company_existing'].get_model()
		model_iter = gui_utilities.gtk_list_store_search(model, name, column=1)
		if model_iter is not None:
			return model.get_value(model_iter, 0)
		# check if this company name already exists remotely
		remote_companies = list(self.application.rpc.remote_table('companies', query_filter={'name': name}))
		if len(remote_companies):
			return remote_companies[0].id

		company_id = self.application.rpc(
			'db/table/insert',
			'companies',
			('name', 'description', 'industry_id', 'url_main', 'url_email', 'url_remote_access'),
			(
				name,
				self.get_entry_value('company_description'),
				self._get_tag_from_combobox(self.gobjects['combobox_company_industry'], 'industries'),
				self.get_entry_value('company_url_main'),
				self.get_entry_value('company_url_email'),
				self.get_entry_value('company_url_remote_access')
			)
		)
		self.gobjects['radiobutton_company_existing'].set_active(True)
		return company_id
Example #12
0
	def _get_company_info(self, company_id):
		company = self.application.rpc.graphql("""\
		query getCompany($id: String!) {
			db {
				company(id: $id) {
					id
					description
					name
					industryId
					urlMain
					urlEmail
					urlRemoteAccess
				}
			}
		}""", {'id': company_id})['db']['company']
		combobox = self.gobjects['combobox_company_industry']
		if company['industryId'] is None:
			combobox.set_active_iter(None)
			combobox.get_child().set_text('')
		else:
			combobox.set_active_iter(gui_utilities.gtk_list_store_search(combobox.get_model(), company['industryId']))
		self.gobjects['entry_company_name'].set_text(company['name'])
		self.gobjects['entry_company_description'].set_text(company['description'] or '')
		self.gobjects['entry_company_url_main'].set_text(company['urlMain'] or '')
		self.gobjects['entry_company_url_email'].set_text(company['urlEmail'] or '')
		self.gobjects['entry_company_url_remote_access'].set_text(company['urlRemoteAccess'] or '')
Example #13
0
 def signal_server_event_db(self, _, event_type, rows):
     for row in rows:
         if str(row.campaign_id) != self.config['campaign_id']:
             continue
         if event_type == 'deleted':
             ti = gui_utilities.gtk_list_store_search(
                 self._tv_model, str(row.id))
             if ti is None:
                 self.logger.warning(
                     "received server db event: deleted for non-existent row {0}:{1}"
                     .format(self.table_name, str(row.id)))
             else:
                 gui_utilities.glib_idle_add_wait(self._tv_model.remove, ti)
         elif event_type == 'inserted':
             self.rpc.async_graphql(
                 self.node_query,
                 query_vars={'id': str(row.id)},
                 on_success=self.__async_rpc_cb_server_event_db_inserted,
                 when_idle=True)
         elif event_type == 'updated':
             self.rpc.async_graphql(
                 self.node_query,
                 query_vars={'id': str(row.id)},
                 on_success=self.__async_rpc_cb_server_event_db_updated,
                 when_idle=True)
Example #14
0
	def _highlight_campaign(self, campaign_name):
		treeview = self.gobjects['treeview_campaigns']
		model = treeview.get_model()
		model_iter = gui_utilities.gtk_list_store_search(model, campaign_name, column=_ModelNamedRow._fields.index('name'))
		if model_iter:
			treeview.set_cursor(model.get_path(model_iter), None, False)
			return True
		return False
	def _highlight_campaign(self, campaign_name):
		treeview = self.gobjects['treeview_campaigns']
		model = treeview.get_model()
		model_iter = gui_utilities.gtk_list_store_search(model, campaign_name, column=1)
		if model_iter:
			treeview.set_cursor(model.get_path(model_iter), None, False)
			return True
		return False
Example #16
0
	def _set_defaults(self):
		"""
		Set any default values for widgets. Also load settings from the existing
		campaign if one was specified.
		"""
		calendar = self.gobjects['calendar_campaign_expiration']
		default_day = datetime.datetime.today() + datetime.timedelta(days=31)
		gui_utilities.gtk_calendar_set_pydate(calendar, default_day)

		if self.campaign_id is None:
			return
		campaign = self.application.get_graphql_campaign()

		# set entries
		self.gobjects['entry_campaign_name'].set_text(campaign['name'])
		self.gobjects['entry_validation_regex_username'].set_text(campaign['credentialRegexUsername'] or '')
		self.gobjects['entry_validation_regex_password'].set_text(campaign['credentialRegexPassword'] or '')
		self.gobjects['entry_validation_regex_mfa_token'].set_text(campaign['credentialRegexMfaToken'] or '')

		if campaign['description'] is not None:
			self.gobjects['entry_campaign_description'].set_text(campaign['description'])
		if campaign['campaignType'] is not None:
			combobox = self.gobjects['combobox_campaign_type']
			model = combobox.get_model()
			model_iter = gui_utilities.gtk_list_store_search(model, campaign['campaignType']['id'], column=0)
			if model_iter is not None:
				combobox.set_active_iter(model_iter)

		self.gobjects['checkbutton_alert_subscribe'].set_property('active', self.application.rpc('campaign/alerts/is_subscribed', self.campaign_id))
		self.gobjects['checkbutton_reject_after_credentials'].set_property('active', bool(campaign['maxCredentials']))

		if campaign['company'] is not None:
			self.gobjects['radiobutton_company_existing'].set_active(True)
			combobox = self.gobjects['combobox_company_existing']
			model = combobox.get_model()
			model_iter = gui_utilities.gtk_list_store_search(model, campaign['company']['id'], column=0)
			if model_iter is not None:
				combobox.set_active_iter(model_iter)

		if campaign['expiration'] is not None:
			expiration = utilities.datetime_utc_to_local(campaign['expiration'])
			self.gobjects['checkbutton_expire_campaign'].set_active(True)
			self._expiration_time.time = expiration.time()
			gui_utilities.gtk_calendar_set_pydate(self.gobjects['calendar_campaign_expiration'], expiration.date())
Example #17
0
    def _set_defaults(self):
        """
		Set any default values for widgets. Also load settings from the existing
		campaign if one was specified.
		"""
        calendar = self.gobjects["calendar_campaign_expiration"]
        default_day = datetime.datetime.today() + datetime.timedelta(days=31)
        gui_utilities.gtk_calendar_set_pydate(calendar, default_day)

        if self.campaign_id is None:
            return
        campaign = self.application.rpc.remote_table_row("campaigns", self.campaign_id, cache=True, refresh=True)

        self.gobjects["entry_campaign_name"].set_text(campaign.name)
        if campaign.description is not None:
            self.gobjects["entry_campaign_description"].set_text(campaign.description)
        if campaign.campaign_type_id is not None:
            combobox = self.gobjects["combobox_campaign_type"]
            model = combobox.get_model()
            model_iter = gui_utilities.gtk_list_store_search(model, campaign.campaign_type_id, column=0)
            if model_iter is not None:
                combobox.set_active_iter(model_iter)

        self.gobjects["checkbutton_alert_subscribe"].set_property(
            "active", self.application.rpc("campaign/alerts/is_subscribed", self.campaign_id)
        )
        self.gobjects["checkbutton_reject_after_credentials"].set_property("active", campaign.reject_after_credentials)

        if campaign.company_id is not None:
            self.gobjects["radiobutton_company_existing"].set_active(True)
            combobox = self.gobjects["combobox_company_existing"]
            model = combobox.get_model()
            model_iter = gui_utilities.gtk_list_store_search(model, campaign.company_id, column=0)
            if model_iter is not None:
                combobox.set_active_iter(model_iter)

        if campaign.expiration is not None:
            expiration = utilities.datetime_utc_to_local(campaign.expiration)
            self.gobjects["checkbutton_expire_campaign"].set_active(True)
            gui_utilities.gtk_calendar_set_pydate(self.gobjects["calendar_campaign_expiration"], expiration)
            self.gobjects["spinbutton_campaign_expiration_hour"].set_value(expiration.hour)
            self.gobjects["spinbutton_campaign_expiration_minute"].set_value(expiration.minute)
Example #18
0
	def signal_assistant_prepare(self, _, page):
		page_title = self.assistant.get_page_title(page)
		if page_title == 'Company':
			combobox = self.gobjects['combobox_company_existing']
			model = combobox.get_model()
			company_name = self.gobjects['entry_company_new_name'].get_text()
			if company_name:
				model_iter = gui_utilities.gtk_list_store_search(model, company_name, column=1)
				if model_iter is not None:
					combobox.set_active_iter(model_iter)
					self.gobjects['radiobutton_company_existing'].set_active(True)
Example #19
0
	def signal_assistant_prepare(self, _, page):
		page_title = self.assistant.get_page_title(page)
		if page_title == 'Company':
			combobox = self.gobjects['combobox_company_existing']
			model = combobox.get_model()
			company_name = self.get_entry_value('company_name')
			if company_name:
				model_iter = gui_utilities.gtk_list_store_search(model, company_name, column=1)
				if model_iter is not None:
					combobox.set_active_iter(model_iter)
					self.gobjects['radiobutton_company_existing'].set_active(True)
Example #20
0
	def _get_tag_from_combobox(self, combobox, db_table):
		model = combobox.get_model()
		model_iter = combobox.get_active_iter()
		if model_iter is None:
			campaign_type = combobox.get_child().get_text()
			if not campaign_type:
				return
			model_iter = gui_utilities.gtk_list_store_search(model, campaign_type, column=1)
			if model_iter is None:
				return self.application.rpc('db/table/insert', db_table, 'name', campaign_type)
		return model.get_value(model_iter, 0)
Example #21
0
	def _get_tag_from_combobox(self, combobox, db_table):
		model = combobox.get_model()
		model_iter = combobox.get_active_iter()
		if model_iter is None:
			campaign_type = combobox.get_child().get_text()
			if not campaign_type:
				return
			model_iter = gui_utilities.gtk_list_store_search(model, campaign_type, column=1)
			if model_iter is None:
				return self.application.rpc('db/table/insert', db_table, 'name', campaign_type)
		return model.get_value(model_iter, 0)
	def _configure_settings_dashboard(self):
		if not graphs.has_matplotlib:
			self.gtk_builder_get('frame_dashboard').set_sensitive(False)
			return
		graph_providers = Gtk.ListStore(str, str)
		for graph in graphs.get_graphs():
			graph = graphs.get_graph(graph)
			graph_providers.append([graph.name_human, graph.name])
		for dash_position in ['top_left', 'top_right', 'bottom']:
			combobox = self.gtk_builder_get('combobox_dashboard_' + dash_position)
			combobox.set_model(graph_providers)
			ti = gui_utilities.gtk_list_store_search(graph_providers, self.config.get('dashboard.' + dash_position), column=1)
			combobox.set_active_iter(ti)
Example #23
0
	def _configure_settings_dashboard(self):
		if not graphs.has_matplotlib:
			self.gtk_builder_get('frame_dashboard').set_sensitive(False)
			return
		graph_providers = Gtk.ListStore(str, str)
		for graph in graphs.get_graphs():
			graph = graphs.get_graph(graph)
			graph_providers.append([graph.name_human, graph.name])
		for dash_position in ['top_left', 'top_right', 'bottom']:
			combobox = self.gtk_builder_get('combobox_dashboard_' + dash_position)
			combobox.set_model(graph_providers)
			ti = gui_utilities.gtk_list_store_search(graph_providers, self.config.get('dashboard.' + dash_position), column=1)
			combobox.set_active_iter(ti)
	def _get_company_info(self, company_id):
		company = self.application.rpc.remote_table_row('companies', company_id)

		combobox = self.gobjects['combobox_company_industry']
		if company.industry_id is None:
			combobox.set_active_iter(None)
			combobox.get_child().set_text('')
		else:
			combobox.set_active_iter(gui_utilities.gtk_list_store_search(combobox.get_model(), company.industry_id))
		self.gobjects['entry_company_name'].set_text(company.name)
		self.gobjects['entry_company_description'].set_text(company.description or '')
		self.gobjects['entry_company_url_main'].set_text(company.url_main or '')
		self.gobjects['entry_company_url_email'].set_text(company.url_email or '')
		self.gobjects['entry_company_url_remote_access'].set_text(company.url_remote_access or '')
Example #25
0
 def __async_rpc_cb_populate_url_scheme_combobox(self, addresses):
     addresses = sorted(addresses, key=lambda address: address['port'])
     combobox_url_scheme = self.gobjects['combobox_url_scheme']
     model = combobox_url_scheme.get_model()
     for address in addresses:
         if address['ssl']:
             scheme_name = 'https'
             description = '' if address['port'] == 443 else 'port: ' + str(
                 address['port'])
         else:
             scheme_name = 'http'
             description = '' if address['port'] == 80 else 'port: ' + str(
                 address['port'])
         # use the scheme and port to make a row UID
         model.append(
             _ModelURLScheme(id=scheme_name + '/' + str(address['port']),
                             name=scheme_name,
                             description=description,
                             port=address['port']))
     if gui_utilities.gtk_list_store_search(model, 'https/443'):
         combobox_url_scheme.set_active_id('https/443')
     elif gui_utilities.gtk_list_store_search(model, 'http/80'):
         combobox_url_scheme.set_active_id('http/80')
Example #26
0
	def interact(self):
		self.dialog.show_all()
		self.set_status('Waiting')
		if not web_cloner.has_webkit2:
			gui_utilities.show_dialog_error('WebKit2GTK+ Is Unavailable', self.dialog, 'The WebKit2GTK+ package is not available.')
			self.dialog.destroy()
			return
		while self.dialog.run() == Gtk.ResponseType.APPLY:
			target_url = self.entry_target.get_text()
			if not target_url:
				gui_utilities.show_dialog_error('Missing Information', self.dialog, 'Please set the target URL.')
				self.set_status('Missing Information')
				continue
			dest_dir = self.entry_directory.get_text()
			if not dest_dir:
				gui_utilities.show_dialog_error('Missing Information', self.dialog, 'Please set the destination directory.')
				self.set_status('Missing Information')
				continue
			if not os.access(dest_dir, os.W_OK):
				gui_utilities.show_dialog_error('Invalid Directory', self.dialog, 'Can not write to the specified directory.')
				self.set_status('Invalid Directory')
				continue
			self.objects_save_to_config()

			self.set_status('Cloning', spinner_active=True)
			cloner = web_cloner.WebPageCloner(target_url, dest_dir)
			signal_id = self.button_cancel.connect('clicked', lambda _: cloner.stop_cloning())
			original_label = self.button_cancel.get_label()
			self.button_cancel.set_label('Cancel')
			cloner.wait()
			self.button_cancel.set_label(original_label)
			self.button_cancel.disconnect(signal_id)

			if cloner.load_failed:
				self.set_status('Failed')
				gui_utilities.show_dialog_error('Operation Failed', self.dialog, 'The web page clone operation failed.')
				continue
			for resource in cloner.cloned_resources.values():
				if gui_utilities.gtk_list_store_search(self.resources, resource.resource, column=0):
					continue
				self.resources.append(_ModelNamedRow(
					path=resource.resource,
					mime_type=resource.mime_type or 'N/A',
					size=resource.size
				))
			self.set_status('Done')
			gui_utilities.gtk_sync()
		if len(self.resources) and gui_utilities.show_dialog_yes_no('Transfer Cloned Pages', self.dialog, 'Would you like to start the SFTP client\nto upload the cloned pages?'):
			self.application.emit('sftp-client-start')
		self.dialog.destroy()
Example #27
0
 def _get_company_existing_id(self):
     combobox = self.gobjects['combobox_company_existing']
     model = combobox.get_model()
     model_iter = combobox.get_active_iter()
     if model is None:
         return
     if model_iter is None:
         text = combobox.get_child().get_text().strip()
         if text:
             model_iter = gui_utilities.gtk_list_store_search(model,
                                                              text,
                                                              column=1)
     if model_iter is None:
         return None
     return model.get_value(model_iter, 0)
Example #28
0
	def _set_company_info(self, company_id):
		company_name = self.get_entry_value('company_name')
		company_description = self.get_entry_value('company_description')
		self.application.rpc.remote_table_row_set('companies', company_id, {
			'name': company_name,
			'description': company_description,
			'industry_id': self._get_tag_from_combobox(self.gobjects['combobox_company_industry'], 'industries'),
			'url_main': self.get_entry_value('company_url_main'),
			'url_email': self.get_entry_value('company_url_email'),
			'url_remote_access': self.get_entry_value('company_url_remote_access')
		})
		model = self.gobjects['combobox_company_existing'].get_model()
		model_iter = gui_utilities.gtk_list_store_search(model, company_id)
		model[model_iter][1] = company_name
		model[model_iter][2] = company_description
	def _set_company_info(self, company_id):
		campaign = self.application.rpc.remote_table_row('campaigns', self.config['campaign_id'])
		company = self.application.rpc.remote_table_row('companies', company_id)
		company.name = self.get_entry_value('company_name')
		company.description = self.get_entry_value('company_description')
		company.industry_id = self._get_tag_from_combobox(self.gobjects['combobox_company_industry'], 'industries')
		company.url_main = self.get_entry_value('company_url_main')
		company.url_email = self.get_entry_value('company_url_email')
		company.url_remote_access = self.get_entry_value('company_url_remote_access')
		company.commit()
		model = self.gobjects['combobox_company_existing'].get_model()
		model_iter = gui_utilities.gtk_list_store_search(model, company_id)
		model[model_iter][1] = company.name
		model[model_iter][2] = company.description
		if campaign.company_id == company.id:
			self.application.emit('campaign-changed', campaign.id)
Example #30
0
 def __async_rpc_cb_server_event_db_updated(self, results):
     node = results['db']['node']
     if node is None:
         self.logger.warning(
             'received server db event: updated but could not fetch the remote data'
         )
         return
     node_id = str(node['id'])
     ti = gui_utilities.gtk_list_store_search(self._tv_model, node_id)
     if ti is None:
         self.logger.warning(
             "received server db event: updated for non-existent row {0}:{1}"
             .format(self.table_name, node_id))
         return
     row_data = tuple(self.format_node_data(node))
     for idx, cell_data in enumerate(row_data, 1):
         self._tv_model[ti][idx] = cell_data
	def __init__(self, *args, **kwargs):
		super(CompanyEditorDialog, self).__init__(*args, **kwargs)
		self._company_info_changed = False
		self._last_company_id = None
		self._set_comboboxes()
		self.gobjects['combobox_company_industry'].connect('changed', self.signal_editable_changed)
		self.gobjects['entry_company_industry'].connect('changed', self.signal_editable_changed)
		self.gobjects['entry_company_name'].connect('changed', self.signal_editable_changed)
		self.gobjects['entry_company_description'].connect('changed', self.signal_editable_changed)
		self.gobjects['entry_company_url_main'].connect('changed', self.signal_editable_changed)
		self.gobjects['entry_company_url_email'].connect('changed', self.signal_editable_changed)
		self.gobjects['entry_company_url_remote_access'].connect('changed', self.signal_editable_changed)

		campaign = self.application.rpc.graphql_find_file('get_campaign.graphql', id=self.config['campaign_id'])['db']['campaign']
		if campaign['company'] is not None:
			combobox = self.gobjects['combobox_company_existing']
			combobox.set_active_iter(gui_utilities.gtk_list_store_search(combobox.get_model(), str(campaign['company']['id'])))
			self._get_company_info(campaign['company']['id'])
Example #32
0
    def signal_combobox_changed_set_url_information(self, _):
        for label in ('info_title', 'info_authors', 'info_created',
                      'info_description'):
            self.gobjects['label_url_' + label].set_text('')
        hostname = gui_utilities.gtk_combobox_get_entry_text(
            self.gobjects['combobox_url_hostname'])
        if not hostname:
            return
        combobox_url_path = self.gobjects['combobox_url_path']
        path = gui_utilities.gtk_combobox_get_active_cell(combobox_url_path,
                                                          column=1)
        if path is None:
            model = combobox_url_path.get_model()
            text = utilities.make_webrelpath(
                gui_utilities.gtk_combobox_get_entry_text(combobox_url_path))
            row_iter = gui_utilities.gtk_list_store_search(model, text)
            if row_iter:
                path = model[row_iter][1]
        gui_utilities.gtk_widget_destroy_children(
            self.gobjects['listbox_url_info_classifiers'])
        gui_utilities.gtk_widget_destroy_children(
            self.gobjects['listbox_url_info_references'])
        cached_result = self._cache_site_template.get((hostname, path))
        if cached_result:
            self.__async_rpc_cb_populate_url_info(hostname, path,
                                                  cached_result)
            return
        self.application.rpc.async_graphql(
            """
			query getSiteTemplate($hostname: String, $path: String) {
			  siteTemplate(hostname: $hostname, path: $path) {
				created path metadata { title authors description referenceUrls classifiers pages }
			  }
			}
			""",
            query_vars={
                'hostname': hostname,
                'path': path
            },
            on_success=self.__async_rpc_cb_populate_url_info,
            cb_args=(hostname, path),
            when_idle=True)
Example #33
0
 def _set_company_info(self, company_id):
     campaign = self.application.rpc.remote_table_row(
         'campaigns', self.config['campaign_id'])
     company = self.application.rpc.remote_table_row(
         'companies', company_id)
     company.name = self.get_entry_value('company_name')
     company.description = self.get_entry_value('company_description')
     company.industry_id = self._get_tag_from_combobox(
         self.gobjects['combobox_company_industry'], 'industries')
     company.url_main = self.get_entry_value('company_url_main')
     company.url_email = self.get_entry_value('company_url_email')
     company.url_remote_access = self.get_entry_value(
         'company_url_remote_access')
     company.commit()
     model = self.gobjects['combobox_company_existing'].get_model()
     model_iter = gui_utilities.gtk_list_store_search(model, company_id)
     model[model_iter][1] = company.name
     model[model_iter][2] = company.description
     if campaign.company_id == company.id:
         self.application.emit('campaign-changed', campaign.id)
Example #34
0
	def signal_server_event_db(self, _, event_type, rows):
		get_node = lambda id: self.rpc.graphql(self.node_query, {'id': str(id)})['db']['node']
		for row in rows:
			if str(row.campaign_id) != self.config['campaign_id']:
				continue
			for case in utilities.switch(event_type):
				if case('inserted'):
					row_data = (str(row.id),) + tuple(self.format_node_data(get_node(row.id)))
					gui_utilities.glib_idle_add_wait(self._tv_model.append, row_data)
				ti = gui_utilities.gtk_list_store_search(self._tv_model, str(row.id))
				if ti is None:
					self.logger.warning("received server db event: {0} for non-existent row {1}:{2}".format(event_type, self.table_name, str(row.id)))
					break
				if case('deleted'):
					self._tv_model.remove(ti)
					break
				if case('updated'):
					row_data = self.format_node_data(get_node(row.id))
					for idx, cell_data in enumerate(row_data, 1):
						self._tv_model[ti][idx] = cell_data
					break
Example #35
0
    def _get_company_info(self, company_id):
        company = self.application.rpc.remote_table_row(
            'companies', company_id)

        combobox = self.gobjects['combobox_company_industry']
        if company.industry_id is None:
            combobox.set_active_iter(None)
            combobox.get_child().set_text('')
        else:
            combobox.set_active_iter(
                gui_utilities.gtk_list_store_search(combobox.get_model(),
                                                    company.industry_id))
        self.gobjects['entry_company_name'].set_text(company.name)
        self.gobjects['entry_company_description'].set_text(company.description
                                                            or '')
        self.gobjects['entry_company_url_main'].set_text(company.url_main
                                                         or '')
        self.gobjects['entry_company_url_email'].set_text(company.url_email
                                                          or '')
        self.gobjects['entry_company_url_remote_access'].set_text(
            company.url_remote_access or '')
Example #36
0
    def _get_company_new_id(self):
        name = self.gobjects["entry_company_new_name"].get_text()
        name = name.strip()
        # check if this company name already exists in the model
        model = self.gobjects["combobox_company_existing"].get_model()
        model_iter = gui_utilities.gtk_list_store_search(model, name, column=1)
        if model_iter is not None:
            return model.get_value(model_iter, 0)
            # check if this company name already exists remotely
        remote_companies = list(self.application.rpc.remote_table("companies", query_filter={"name": name}))
        if len(remote_companies):
            return remote_companies[0].id

        description = self.gobjects["entry_company_new_description"].get_text()
        description = description.strip()
        if description == "":
            description = None
        industry_id = self._get_tag_from_combobox(self.gobjects["combobox_company_industry"], "industries")
        company_id = self.application.rpc(
            "db/table/insert", "companies", ("name", "description", "industry_id"), (name, description, industry_id)
        )
        self.gobjects["radiobutton_company_existing"].set_active(True)
        return company_id
Example #37
0
 def _set_company_info(self, company_id):
     company_name = self.get_entry_value('company_name')
     company_description = self.get_entry_value('company_description')
     self.application.rpc.remote_table_row_set(
         'companies', company_id, {
             'name':
             company_name,
             'description':
             company_description,
             'industry_id':
             self._get_tag_from_combobox(
                 self.gobjects['combobox_company_industry'], 'industries'),
             'url_main':
             self.get_entry_value('company_url_main'),
             'url_email':
             self.get_entry_value('company_url_email'),
             'url_remote_access':
             self.get_entry_value('company_url_remote_access')
         })
     model = self.gobjects['combobox_company_existing'].get_model()
     model_iter = gui_utilities.gtk_list_store_search(model, company_id)
     model[model_iter][1] = company_name
     model[model_iter][2] = company_description
Example #38
0
    def interact(self):
        self.dialog.show_all()
        self.set_status('Waiting')
        if not web_cloner.has_webkit2:
            gui_utilities.show_dialog_error(
                'WebKit2GTK+ Is Unavailable', self.dialog,
                'The WebKit2GTK+ package is not available.')
            self.dialog.destroy()
            return
        while self.dialog.run() == Gtk.ResponseType.APPLY:
            target_url = self.entry_target.get_text()
            if not target_url:
                gui_utilities.show_dialog_error('Missing Information',
                                                self.dialog,
                                                'Please set the target URL.')
                self.set_status('Missing Information')
                continue
            dest_dir = self.entry_directory.get_text()
            if not dest_dir:
                gui_utilities.show_dialog_error(
                    'Missing Information', self.dialog,
                    'Please set the destination directory.')
                self.set_status('Missing Information')
                continue
            if not os.access(dest_dir, os.W_OK):
                gui_utilities.show_dialog_error(
                    'Invalid Directory', self.dialog,
                    'Can not write to the specified directory.')
                self.set_status('Invalid Directory')
                continue
            self.objects_save_to_config()

            self.set_status('Cloning', spinner_active=True)
            cloner = web_cloner.WebPageCloner(target_url, dest_dir)
            signal_id = self.button_cancel.connect(
                'clicked', lambda _: cloner.stop_cloning())
            original_label = self.button_cancel.get_label()
            self.button_cancel.set_label('Cancel')
            cloner.wait()
            self.button_cancel.set_label(original_label)
            self.button_cancel.disconnect(signal_id)

            if cloner.load_failed:
                self.set_status('Failed')
                gui_utilities.show_dialog_error(
                    'Operation Failed', self.dialog,
                    'The web page clone operation failed.')
                continue
            for resource in cloner.cloned_resources.values():
                if gui_utilities.gtk_list_store_search(self.resources,
                                                       resource.resource,
                                                       column=0):
                    continue
                self.resources.append(
                    _ModelNamedRow(path=resource.resource,
                                   mime_type=resource.mime_type or 'N/A',
                                   size=resource.size))
            self.set_status('Done')
            gui_utilities.gtk_sync()
        if len(self.resources) and gui_utilities.show_dialog_yes_no(
                'Transfer Cloned Pages', self.dialog,
                'Would you like to start the SFTP client\nto upload the cloned pages?'
        ):
            self.application.emit('sftp-client-start')
        self.dialog.destroy()
Example #39
0
    def change_cwd(self, new_dir):
        """
		Changes current working directory to given parameter.

		:param str new_dir: The directory to change the CWD to.
		:return: The absolute path of the new working directory if it was changed.
		:rtype: str
		"""
        if not self.path_mod.isabs(new_dir):
            new_dir = self.get_abspath(new_dir)
        if new_dir == self.cwd:
            return
        logger.debug(
            "{} is trying to change current working directory to {}".format(
                self.location, new_dir))
        try:
            self._chdir(new_dir)
        except OSError:
            logger.warning(
                "user does not have permissions to read {}".format(new_dir))
            gui_utilities.show_dialog_error(
                'Plugin Error', self.application.get_active_window(),
                "You do not have permissions to access {}.".format(new_dir))
            return

        self._tv_model.clear()
        try:
            self.load_dirs(new_dir)
        except OSError:
            logger.warning(
                "user does not have permissions to read {}".format(new_dir))
            if self.cwd:
                self.load_dirs(self.cwd)
                gui_utilities.show_dialog_error(
                    'Plugin Error', self.application.get_active_window(),
                    "You do not have permissions to access {}.".format(
                        new_dir))
            else:
                logger.warning(
                    self.location +
                    " has no current working directory, using the root directory"
                )
                self.default_directory = self.root_directory
                self.change_cwd(self.default_directory)
            return

        self.cwd = new_dir
        # clear and rebuild the model
        self._wdcb_model.clear()
        self._wdcb_model.append((self.root_directory, ))
        if self.default_directory != self.root_directory:
            self._wdcb_model.append((self.default_directory, ))
        if new_dir not in self.wd_history and gui_utilities.gtk_list_store_search(
                self._wdcb_model, new_dir) is None:
            self.wd_history.appendleft(new_dir)
        for directory in self.wd_history:
            self._wdcb_model.append((directory, ))
        active_iter = gui_utilities.gtk_list_store_search(
            self._wdcb_model, new_dir)
        self.wdcb_dropdown.set_active_iter(active_iter)
        return new_dir