def signal_button_clicked_sender_start(self, button): required_settings = { 'mailer.webserver_url': 'Web Server URL', 'mailer.company_name': 'Company Name', 'mailer.source_email': 'Source Email', 'mailer.subject': 'Friendly Alias', 'mailer.html_file': 'Message HTML File', 'mailer.target_file': 'Target CSV File' } for setting, setting_name in required_settings.items(): if not self.config.get(setting): gui_utilities.show_dialog_warning("Missing Required Option: '{0}'".format(setting_name), self.parent, 'Return to the Config tab and set all required options') return if not setting.endswith('_file'): continue file_path = self.config[setting] if not (os.path.isfile(file_path) and os.access(file_path, os.R_OK)): gui_utilities.show_dialog_warning('Invalid Option Configuration', self.parent, "Setting: '{0}'\nReason: File could not be read".format(setting_name)) return if not self.config.get('smtp_server'): gui_utilities.show_dialog_warning('Missing SMTP Server Setting', self.parent, 'Please configure the SMTP server') return if self.sender_thread: return self.parent.save_config() self.gobjects['button_mail_sender_start'].set_sensitive(False) self.gobjects['button_mail_sender_stop'].set_sensitive(True) self.progressbar.set_fraction(0) self.sender_thread = MailSenderThread(self.config, self.config['mailer.target_file'], self, self.parent.rpc) # Connect to the SMTP server if self.config['smtp_ssh_enable']: while True: self.text_insert('Connecting To SSH... ') login_dialog = KingPhisherClientSSHLoginDialog(self.config, self.parent) login_dialog.objects_load_from_config() response = login_dialog.interact() if response == Gtk.ResponseType.CANCEL: self.sender_start_failure(text='Canceled.\n') return if self.sender_thread.server_ssh_connect(): self.text_insert('Done.\n') break self.sender_start_failure('Failed to connect to SSH', 'Failed.\n') self.text_insert('Connecting To SMTP Server... ') if not self.sender_thread.server_smtp_connect(): self.sender_start_failure('Failed to connect to SMTP', 'Failed.\n') return self.text_insert('Done.\n') parsed_target_url = urlparse.urlparse(self.config['mailer.webserver_url']) landing_page_hostname = parsed_target_url.netloc landing_page = parsed_target_url.path landing_page = landing_page.lstrip('/') self.parent.rpc('campaign/landing_page/new', self.config['campaign_id'], landing_page_hostname, landing_page) self.sender_thread.start() self.gobjects['togglebutton_mail_sender_pause'].set_sensitive(True)
class MailSenderSendMessagesTab(gui_utilities.UtilityGladeGObject): gobject_ids = [ 'button_mail_sender_start', 'button_mail_sender_stop', 'textview_mail_sender_progress', 'togglebutton_mail_sender_pause', 'progressbar_mail_sender', 'scrolledwindow_mail_sender_progress' ] top_gobject = 'box' def __init__(self, *args, **kwargs): self.label = Gtk.Label('Send Messages') super(MailSenderSendMessagesTab, self).__init__(*args, **kwargs) self.textview = self.gobjects['textview_mail_sender_progress'] self.textbuffer = self.textview.get_buffer() self.textbuffer_iter = self.textbuffer.get_start_iter() self.progressbar = self.gobjects['progressbar_mail_sender'] self.pause_button = self.gobjects['togglebutton_mail_sender_pause'] self.sender_thread = None def signal_button_clicked_sender_start(self, button): required_settings = { 'mailer.webserver_url': 'Web Server URL', 'mailer.company_name': 'Company Name', 'mailer.source_email': 'Source Email', 'mailer.subject': 'Friendly Alias', 'mailer.html_file': 'Message HTML File', 'mailer.target_file': 'Target CSV File' } for setting, setting_name in required_settings.items(): if not self.config.get(setting): gui_utilities.show_dialog_warning("Missing Required Option: '{0}'".format(setting_name), self.parent, 'Return to the Config tab and set all required options') return if not setting.endswith('_file'): continue file_path = self.config[setting] if not (os.path.isfile(file_path) and os.access(file_path, os.R_OK)): gui_utilities.show_dialog_warning('Invalid Option Configuration', self.parent, "Setting: '{0}'\nReason: File could not be read".format(setting_name)) return if not self.config.get('smtp_server'): gui_utilities.show_dialog_warning('Missing SMTP Server Setting', self.parent, 'Please configure the SMTP server') return if self.sender_thread: return self.parent.save_config() self.gobjects['button_mail_sender_start'].set_sensitive(False) self.gobjects['button_mail_sender_stop'].set_sensitive(True) self.progressbar.set_fraction(0) self.sender_thread = MailSenderThread(self.config, self.config['mailer.target_file'], self, self.parent.rpc) # Connect to the SMTP server if self.config['smtp_ssh_enable']: while True: self.text_insert('Connecting To SSH... ') login_dialog = KingPhisherClientSSHLoginDialog(self.config, self.parent) login_dialog.objects_load_from_config() response = login_dialog.interact() if response == Gtk.ResponseType.CANCEL: self.sender_start_failure(text='Canceled.\n') return if self.sender_thread.server_ssh_connect(): self.text_insert('Done.\n') break self.sender_start_failure('Failed to connect to SSH', 'Failed.\n') self.text_insert('Connecting To SMTP Server... ') if not self.sender_thread.server_smtp_connect(): self.sender_start_failure('Failed to connect to SMTP', 'Failed.\n') return self.text_insert('Done.\n') parsed_target_url = urlparse.urlparse(self.config['mailer.webserver_url']) landing_page_hostname = parsed_target_url.netloc landing_page = parsed_target_url.path landing_page = landing_page.lstrip('/') self.parent.rpc('campaign/landing_page/new', self.config['campaign_id'], landing_page_hostname, landing_page) self.sender_thread.start() self.gobjects['togglebutton_mail_sender_pause'].set_sensitive(True) def signal_button_clicked_sender_stop(self, button): if not self.sender_thread: return if not gui_utilities.show_dialog_yes_no('Are you sure you want to stop?', self.parent): return self.sender_thread.stop() self.gobjects['button_mail_sender_stop'].set_sensitive(False) self.gobjects['button_mail_sender_start'].set_sensitive(True) self.gobjects['togglebutton_mail_sender_pause'].set_property('active', False) self.gobjects['togglebutton_mail_sender_pause'].set_sensitive(False) def signal_button_toggled_sender_pause(self, button): if not self.sender_thread: return if button.get_property('active'): self.sender_thread.pause() else: self.sender_thread.unpause() def signal_textview_size_allocate_autoscroll(self, textview, allocation): scrolled_window = self.gobjects['scrolledwindow_mail_sender_progress'] adjustment = scrolled_window.get_vadjustment() adjustment.set_value(adjustment.get_upper() - adjustment.get_page_size()) def text_insert(self, message): self.textbuffer.insert(self.textbuffer_iter, message) def notify_status(self, message): self.text_insert(message) def notify_sent(self, emails_done, emails_total): self.progressbar.set_fraction(float(emails_done) / float(emails_total)) def sender_start_failure(self, message=None, text=None): if text: self.text_insert(text) self.gobjects['button_mail_sender_stop'].set_sensitive(False) self.gobjects['button_mail_sender_start'].set_sensitive(True) if message: gui_utilities.show_dialog_error(message, self.parent) self.sender_thread = None def notify_stopped(self): self.progressbar.set_fraction(1) self.gobjects['button_mail_sender_stop'].set_sensitive(False) self.gobjects['togglebutton_mail_sender_pause'].set_property('active', False) self.gobjects['togglebutton_mail_sender_pause'].set_sensitive(False) self.gobjects['button_mail_sender_start'].set_sensitive(True) self.sender_thread = None