Beispiel #1
0
 def add_folders(self, paths):
     paths_to_add = []
     for path in paths:
         basename = os.path.basename(os.path.normpath(path))
         if not os.path.isdir(path):
             error(
                 self,
                 'Cannot add "{}".'.format(basename),
                 "{} only supports uploading and syncing folders,"
                 " and not individual files.".format(APP_NAME),
             )
         elif self.gateway.magic_folder_exists(basename):
             error(
                 self,
                 "Folder already exists",
                 'You already belong to a folder named "{}" on {}. Please '
                 "rename it and try again.".format(basename,
                                                   self.gateway.name),
             )
         else:
             paths_to_add.append(path)
     if paths_to_add:
         self.hide_drop_label()
         tasks = []
         for path in paths_to_add:
             tasks.append(self.add_folder(path))
         d = DeferredList(tasks)
         d.addCallback(self.maybe_restart_gateway)
Beispiel #2
0
 def start_gateways(self):
     nodedirs = get_nodedirs(config_dir)
     if nodedirs:
         minimize_preference = get_preference('startup', 'minimize')
         if not minimize_preference or minimize_preference == 'false':
             self.gui.show_main_window()
         yield self.select_executable()
         tor_available = yield get_tor(reactor)
         logging.debug("Starting Tahoe-LAFS gateway(s)...")
         for nodedir in nodedirs:
             gateway = Tahoe(nodedir, executable=self.executable)
             tcp = gateway.config_get('connections', 'tcp')
             if tcp == 'tor' and not tor_available:
                 msg.error(
                     self.gui.main_window, "Error Connecting To Tor Daemon",
                     'The "{}" connection is configured to use Tor, '
                     'however, no running tor daemon was found.\n\n'
                     'This connection will be disabled until you launch '
                     'Tor again.'.format(gateway.name))
             self.gateways.append(gateway)
             d = gateway.start()
             d.addCallback(gateway.ensure_folder_links)
         self.gui.populate(self.gateways)
     else:
         self.gui.show_welcome_dialog()
         yield self.select_executable()
Beispiel #3
0
 def confirm_export(self, path):
     if os.path.isfile(path):
         info(self, "Export successful",
              "Recovery Key successfully exported to {}".format(path))
     else:
         error(self, "Error exporting Recovery Key",
               "Destination file not found after export: {}".format(path))
Beispiel #4
0
 def load_from_file(self, path):
     try:
         with open(path, 'rb') as f:
             content = f.read()
     except Exception as e:  # pylint: disable=broad-except
         error(self, type(e).__name__, str(e))
         return
     self.parse_content(content)
Beispiel #5
0
 def _load_from_file(self, path):
     logging.debug("Loading %s...", self.filepath)
     try:
         with open(path, "rb") as f:
             content = f.read()
     except Exception as e:  # pylint: disable=broad-except
         error(self, type(e).__name__, str(e))
         return
     self._parse_content(content)
Beispiel #6
0
 def _on_decryption_succeeded(self, plaintext):
     logging.debug("Decryption of %s succeeded", self.filepath)
     self.crypter_thread.quit()
     try:
         settings = json.loads(plaintext.decode("utf-8"))
     except (UnicodeDecodeError, json.decoder.JSONDecodeError) as e:
         error(self, type(e).__name__, str(e))
         return
     self.done.emit(settings)
     self.crypter_thread.wait()
Beispiel #7
0
 def get_folder_invite(self, folder):
     member_id = b58encode(os.urandom(8))
     try:
         code = yield self.gateway.magic_folder_invite(folder, member_id)
     except TahoeError as err:
         code = None
         self.wormhole.close()
         error(self, "Invite Error", str(err))
         self.close()
     return folder, member_id, code
Beispiel #8
0
 def _export_plaintext_recovery(self, gateway):
     dest, _ = QFileDialog.getSaveFileName(
         self.parent, "Select a destination",
         os.path.join(os.path.expanduser('~'),
                      gateway.name + ' Recovery Key.json'))
     if not dest:
         return
     try:
         gateway.export(dest, include_rootcap=True)
     except Exception as e:  # pylint: disable=broad-except
         error(self.parent, "Error exporting Recovery Key", str(e))
         return
     self.done.emit(dest)
Beispiel #9
0
 def download_folder(self, folder_name, dest):
     try:
         yield self.gateway.restore_magic_folder(folder_name, dest)
     except Exception as e:  # pylint: disable=broad-except
         error(
             self,
             'Error downloading folder "{}"'.format(folder_name),
             'An exception was raised when downloading the "{}" folder:\n\n'
             '{}: {}'.format(folder_name, type(e).__name__, str(e))
         )
         return
     self._restart_required = True
     logging.debug(
         'Successfully joined folder "%s"; scheduled restart', folder_name)
Beispiel #10
0
 def unlink_folder(self, folder_name):
     try:
         yield self.gateway.unlink_magic_folder_from_rootcap(folder_name)
     except Exception as e:  # pylint: disable=broad-except
         logging.error("%s: %s", type(e).__name__, str(e))
         error(
             self, 'Error unlinking folder "{}"'.format(folder_name),
             'An exception was raised when unlinking the "{}" folder:\n\n'
             '{}: {}\n\nPlease try again later.'.format(
                 folder_name,
                 type(e).__name__, str(e)))
         return
     self.model().remove_folder(folder_name)
     self._rescan_required = True
     logging.debug('Successfully unlinked folder "%s"; scheduled rescan',
                   folder_name)
Beispiel #11
0
 def export_to_file(self):
     dest, _ = QFileDialog.getSaveFileName(
         self, "Select a destination",
         os.path.join(os.path.expanduser('~'),
                      APP_NAME + ' Debug Information.txt'))
     if not dest:
         return
     try:
         with atomic_write(dest, mode='w', overwrite=True) as f:
             f.write(self.plaintextedit.toPlainText())
     except Exception as e:  # pylint: disable=broad-except
         logging.error("%s: %s", type(e).__name__, str(e))
         error(
             self,
             "Error exporting debug information",
             str(e),
         )
         return
     self.close()
Beispiel #12
0
 def add_folder(self, path):
     path = os.path.realpath(path)
     self.model().add_folder(path)
     folder_name = os.path.basename(path)
     try:
         yield self.gateway.create_magic_folder(path)
     except Exception as e:  # pylint: disable=broad-except
         logging.error("%s: %s", type(e).__name__, str(e))
         error(
             self, 'Error adding folder "{}"'.format(folder_name),
             'An exception was raised when adding the "{}" folder:\n\n'
             '{}: {}\n\nPlease try again later.'.format(
                 folder_name,
                 type(e).__name__, str(e)))
         self.model().remove_folder(folder_name)
         return
     self._restart_required = True
     logging.debug('Successfully added folder "%s"; scheduled restart',
                   folder_name)
Beispiel #13
0
 def remove_folder(self, folder_name, unlink=False):
     try:
         yield self.gateway.remove_magic_folder(folder_name)
     except Exception as e:  # pylint: disable=broad-except
         error(
             self,
             'Error removing folder "{}"'.format(folder_name),
             'An exception was raised when removing the "{}" folder:\n\n'
             '{}: {}\n\nPlease try again later.'.format(
                 folder_name, type(e).__name__, str(e)
             )
         )
         return
     self.model().remove_folder(folder_name)
     self._restart_required = True
     logging.debug(
         'Successfully removed folder "%s"; scheduled restart', folder_name)
     if unlink:
         yield self.unlink_folder(folder_name)
Beispiel #14
0
 def start_gateways(self):
     nodedirs = get_nodedirs(config_dir)
     if nodedirs:
         minimize_preference = get_preference("startup", "minimize")
         if not minimize_preference or minimize_preference == "false":
             self.gui.show_main_window()
         yield self.select_executable()
         tor_available = yield get_tor(reactor)
         logging.debug("Starting Tahoe-LAFS gateway(s)...")
         for nodedir in nodedirs:
             gateway = Tahoe(nodedir, executable=self.executable)
             tcp = gateway.config_get("connections", "tcp")
             if tcp == "tor" and not tor_available:
                 logging.error("No running tor daemon found")
                 msg.error(
                     self.gui.main_window,
                     "Error Connecting To Tor Daemon",
                     'The "{}" connection is configured to use Tor, '
                     "however, no running tor daemon was found.\n\n"
                     "This connection will be disabled until you launch "
                     "Tor again.".format(gateway.name),
                 )
             self.gateways.append(gateway)
             d = gateway.start()
             d.addCallback(gateway.ensure_folder_links)
         self.gui.populate(self.gateways)
     else:
         self.gui.show_welcome_dialog()
         yield self.select_executable()
     try:
         yield self.get_tahoe_version()
     except Exception as e:  # pylint: disable=broad-except
         logging.critical("Error getting Tahoe-LAFS version")
         msg.critical(
             "Error getting Tahoe-LAFS version",
             "{}: {}".format(type(e).__name__, str(e)),
         )
         reactor.stop()
Beispiel #15
0
 def show_failure(self, failure):
     error(
         self,
         str(failure.type.__name__),
         str(failure.value)
     )
Beispiel #16
0
 def on_decryption_failed(self, msg):
     self.crypter_thread.quit()
     error(self, "Decryption failed", msg)
     self.crypter_thread.wait()
Beispiel #17
0
 def show_failure(self, failure):
     logging.error("%s: %s", str(failure.type.__name__), str(failure.value))
     error(self, str(failure.type.__name__), str(failure.value))
Beispiel #18
0
 def _on_encryption_failed(self, message):
     self.crypter_thread.quit()
     error(self.parent, "Error encrypting data", message)
     self.crypter_thread.wait()