Coder Social home page Coder Social logo

scille / parsec-cloud Goto Github PK

View Code? Open in Web Editor NEW
268.0 11.0 40.0 72.67 MB

Open source Dropbox-like file sharing with full client encryption !

Home Page: https://parsec.cloud

License: Other

Python 19.92% Shell 0.09% CSS 0.01% Dockerfile 0.03% HTML 0.20% Rust 60.04% Kotlin 0.02% JavaScript 0.24% Java 0.03% TypeScript 8.90% Vue 9.40% Jinja 0.64% C++ 0.15% C 0.05% SCSS 0.24% Batchfile 0.01% NSIS 0.01% PowerShell 0.01%
cloud security dropbox sharing-data privacy file-sharing

parsec-cloud's Introduction

docs/parsec_doc_logo.png

Parsec

Continuous Integration Latest Server Packaging CI Latest App Packaging CI Pypi Status Documentation Status Code style: ruff

Homepage: https://parsec.cloud

Documentation: https://parsec-cloud.readthedocs.org.

Parsec allows you to easily share your work and data in the cloud in total privacy thanks to end-to-end cryptographic security.

docs/parsec_snapshot.png

Key features:

  • Works as a virtual drive on you computer. You can access and modify all the data stored in Parsec with your regular software just like you would on your local hard-drive.
  • Never lose any data. Synchronization with the remote server never destroy any data, hence you can browse data history and recover from any point in time.
  • Client-side cryptographic security. Data and metadata are only visible by you and the ones you choose to share with.
  • Cryptographic signature. Each modification is signed by it author making trivial to identify modifications.
  • Cloud provider agnostic. Server provides connectors for S3 and swift object storage.
  • Simplified enrollment. New user enrollment is simple as sharing a link and a token code.

Installation methods

Windows installer

Windows installers are available at https://github.com/Scille/parsec-cloud/releases/latest

Linux Snap

Available for Linux through Snapcraft at https://snapcraft.io/parsec

Self-hosted

If you want to self-host a Parsec server, take a look at Hosting a Parsec server

parsec-cloud's People

Contributors

adcorpo avatar alexandrediasldev avatar antoinedupre avatar aureliadolo avatar bitlogik avatar c1em avatar c4ffein avatar d-bao avatar delantonio avatar dependabot[bot] avatar dimitripapadopoulos avatar fabiensvtr avatar firelightflagboy avatar ironicbay avatar jojon0tfound avatar julierossi avatar landeers avatar linkdd avatar luansmartr avatar max-7 avatar mmmarcos avatar mohanadft avatar nicotuxx avatar sithi5 avatar steevenakintilo avatar timeengineer avatar touilleman avatar vamonte avatar volham22 avatar vxgmichel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

parsec-cloud's Issues

Crash on fs.entry.updated event

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/snap/parsec/38/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/snap/parsec/38/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/main_window.py", line 109, in _run_core
    trio.run(_run)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_run.py", line 1337, in run
    raise runner.main_task_outcome.error
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/main_window.py", line 107, in _run
    await trio.sleep_forever()
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/async_generator/_util.py", line 53, in __aexit__
    await self._agen.athrow(type, value, traceback)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/logged_core.py", line 110, in logged_core_factory
    await mountpoint_manager.teardown()
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_run.py", line 397, in __aexit__
    raise combined_error_from_nursery
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/backend_connection/event_listener.py", line 166, in backend_listen_events
    await backend_events_manager.run(task_status=task_status)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/backend_connection/event_listener.py", line 76, in run
    await self._event_listener_manager()
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/backend_connection/event_listener.py", line 100, in _event_listener_manager
    logger.info("Event listener restarted")
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_run.py", line 397, in __aexit__
    raise combined_error_from_nursery
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/backend_connection/event_listener.py", line 139, in _event_pump
    await self._event_pump_do(cmds)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/backend_connection/event_listener.py", line 157, in _event_pump_do
    src_version=rep["src_version"],
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/event_bus.py", line 50, in send
    cb(event, **kwargs)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/beacons_monitor.py", line 37, in _on_beacon_updated
    event_bus.send("fs.entry.updated", id=src_id)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/event_bus.py", line 55, in send
    self._event_handlers[event] = {cb for cb in self._event_handlers[event] if cb()}
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/event_bus.py", line 55, in <setcomp>
    self._event_handlers[event] = {cb for cb in self._event_handlers[event] if cb()}
TypeError: _on_fs_entry_updated_trio() missing 2 required positional arguments: 'event' and 'id'

Traceback (most recent call last):
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/mount_widget.py", line 36, in load_workspace
    self.files_widget.set_workspace(workspace_name)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/files_widget.py", line 174, in set_workspace
    self.load("")
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/files_widget.py", line 200, in load
    dir_stat = self.portal.run(self.core.fs.stat, dir_path)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 105, in run
    return self._do_it(self._run_cb, afn, *args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 85, in _do_it
    self._trio_token.run_sync_soon(cb, q, fn, args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 195, in run_sync_soon
    sync_fn, *args, idempotent=idempotent
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 113, in run_sync_soon
    raise _core.RunFinishedError("run() has exited")
trio.RunFinishedError: run() has exited
Traceback (most recent call last):
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/main_window.py", line 235, in show_users_widget
    self.users_widget.reset()
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/users_widget.py", line 80, in reset
    users = self.portal.run(self.core.fs.backend_cmds.user_find)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 105, in run
    return self._do_it(self._run_cb, afn, *args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 85, in _do_it
    self._trio_token.run_sync_soon(cb, q, fn, args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 195, in run_sync_soon
    sync_fn, *args, idempotent=idempotent
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 113, in run_sync_soon
    raise _core.RunFinishedError("run() has exited")
trio.RunFinishedError: run() has exited
Traceback (most recent call last):
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/devices_widget.py", line 82, in reset
    user = self.portal.run(self.core.backend_cmds.user_get, self.core.device.user_id)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 105, in run
    return self._do_it(self._run_cb, afn, *args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 85, in _do_it
    self._trio_token.run_sync_soon(cb, q, fn, args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 195, in run_sync_soon
    sync_fn, *args, idempotent=idempotent
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 113, in run_sync_soon
    raise _core.RunFinishedError("run() has exited")
trio.RunFinishedError: run() has exited
Traceback (most recent call last):
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/main_window.py", line 235, in show_users_widget
    self.users_widget.reset()
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/users_widget.py", line 80, in reset
    users = self.portal.run(self.core.fs.backend_cmds.user_find)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 105, in run
    return self._do_it(self._run_cb, afn, *args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 85, in _do_it
    self._trio_token.run_sync_soon(cb, q, fn, args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 195, in run_sync_soon
    sync_fn, *args, idempotent=idempotent
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 113, in run_sync_soon
    raise _core.RunFinishedError("run() has exited")
trio.RunFinishedError: run() has exited
Traceback (most recent call last):
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/parsec/core/gui/devices_widget.py", line 82, in reset
    user = self.portal.run(self.core.backend_cmds.user_get, self.core.device.user_id)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 105, in run
    return self._do_it(self._run_cb, afn, *args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_threads.py", line 85, in _do_it
    self._trio_token.run_sync_soon(cb, q, fn, args)
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 195, in run_sync_soon
    sync_fn, *args, idempotent=idempotent
  File "/snap/parsec/38/venv/lib/python3.6/site-packages/trio/_core/_entry_queue.py", line 113, in run_sync_soon
    raise _core.RunFinishedError("run() has exited")
trio.RunFinishedError: run() has exited

should investigate why the unittests didn't catched this earlier (maybe python-trio/pytest-trio#77)

Rework local storage

Need

Stocker les données locales: vlob, block, dirty vlob, dirty block, remote user/device info
Conserver les dirty vlob/block sans limite de temps ni de taille
Une fois synchronisés, supprimer les dirty vlob/block
(bonus) migrer les dirty blocks en block pour éviter des réécritures
Nettoyer les vlobs/blocks non utilisés quand le cache est trop important
(bonus) permettre de spécifier qu'un vlob/block ne doit pas être supprimer pour permettre le mode offline
Les données user/device doivent avoir une durée de vie limitée (~1h) vu que celle-ci peuvent être revoqué à tout instant.

Implementation

  • utilisation de SQlite
  • stockage des vlobs directement dans sqlite
  • stockage des block sous forme de fichiers (==> vérifier les performances auparavant)
  • la table blocks contient la taille de chaque élément + flags (dirty, offline) + date dernier accès + chemin fichier
  • on ne prend pas en compte les vlobs ni la base sqlite dans la taille du cache
  • vu que les blocks font tous ~ la même taille, on calcule le nb de blocks maximum (via la taille de cache max autorisée)
  • garbage collection lazy: si plus de place on remplace le plus vieux blocks

Date format returned by the API

The dateformat returned by the Mocked API is:
datetime.datetime(2017, 6, 13, 16, 54, 58, 775527, tzinfo=datetime.timezone.utc)

It should be:
'2017-06-13T16:54:58.775527'

Please use isoformat.

GUI: User revokation

  • Add user revokation in user management page
  • Display user who have been revoked

Lancement de l'executable

1 - blocage par windows defender qu'il faut bypasser
image
Peut on eviter?

2- comment eliminer la page "parsec core"
capture d ecran 2019-01-15 10 43 43

3 - si je sors de cet ecran sans avoir créé un user , le pgm parsec disparait et je suis oblige de relancer l'executable

Erreur en cas de création d'un utilisateur déjà présent sur le poste

C'est un cas où quelques temps auparavant, on avait créé un user sur son poste (ex : Alice) et qu'on l'a oublié. Si on veut de nouveau créer un user du nom de Alice ou reçoit un message d'erreur "Impossible d'enregistrer le nouvel utilisateur" sans autre précision.
Si dans le répertoire .config/parsec/devices on supprime le compte Alice, il n'est toujours pas possible de créer l'utilisateur Alice sans doute parce que le compte Alice est déjà sur le serveur de métadonnées (??).

Lorsque l'on veut créer un compte Alice3, donc qui n'existait pas avant, on reçoit le même message d'erreur. Ce qui veut dire que ce n'est peut-être pas seulement lié à la dupplication d'un compte existant.

A noter que, dans ce cas d'usage, les deux clients parsec (celui coté de l'enroleur et celui côté de l'enrôlé) sont ouverts sur la même machine
Il faudrait que le message soit plus précis sur ce qu'il convient de faire ans ce cas.

Trustchain verification in core

Need

S'assurer de la validité des données.
En cas d'erreur de sécurité, une notification doit apparaitre à l'utilisateur (contenant les infos: device ayant signé, chemin de la resource, id resource, workspace resource).

Implementation

  • tenter de récupérer le device ayant réalisé la signature dans le LocalDB
  • si pas dispo, récupération du device ainsi que de tous les devices impliqué dans la création/révocation (déjà implémenter dans l'api user_get du backend)
  • vérifier la validité de la chaine fournie
  • à cet étape, stocker l'ensemble des devices dans LocalDB
  • vérifier la signature du device sur la resource

GUI: Notification systems

  • Create the notification interface
  • Create the notification button count
  • Connect all existing core events to notification systems

History system

Need

Naviguer dans l'historique des données
Lire un fichier à une version donnée
Restaurer un fichier/répertoire
(bonus) comparer des versions entre elles

Features

  • bouton historique dans la gui
  • une fois activé
    • fuse/gui passent en read-only
    • champ date dans la gui permettant de naviguer dans le temps
    • bouton restorer à cette version pour les fichiers/répertoires

Implementation

  • fuse support
    • fuse component can hot-swap FS class
    • HistoryFS wrap regular FS with statemachine for date, read only mode
  • backend api
    • allow date based request
    • allow list vlob versions + pagination retrieval ?

Add group system

Need

Pouvoir créer des groupes d'utilisateurs.

Implementation

  • Créer une resource groupe dans le backend
  • Créer un group manifest contenant l'ensemble des données partagées (accès aux workspaces par exemple)
  • Un groupe se comporte comme un utilisateur: on partage avec lui les workspaces
  • Un message envoyé à un groupe arrive à tous ses utilisateurs

Implement a VFS

This layer should interact with low-level cloud Driver and expose a uniformed API to the connector of the OS drivers. OS driver have to be wrapped to map functions and metadata.

Initial Update

The bot created this issue to inform you that pyup.io has been set up on this repo.
Once you have closed it, the bot will open pull requests for updates as soon as they are available.

Freeze while opening big folder in cli

La cli récupère toutes les métadonnées des fichiers d'un répertoire avant d'afficher celui-ci.
Sur un gros répertoire qui n'est pas dans le cache local, la gui freeze pendant longtemps avant de réaliser l'affichier.

Une solution serait de récupérer uniquement la liste des éléments du répertoire, de rafraichir la vue avec ces infos, puis d'avoir une tache de fond requêter les détails pour chaque fichier (on verait donc les infos du fichiers du répertoire s'afficher au fur et à mesure)

Rework trust seed

Need

Pouvoir partager un workspace en lecture seule.
En l'état les trust seed ne servent plus à rien.
Solution ==> rework de la resource beacon dans le backend.
Un beacon sert à lier un essemble de données opaques:

  • on peut s'abonner à un beacon pour être informé de modifications (déjà implémenté)
  • on peut configurer qui a accès aux données liées à un beacon (à faire)

Implementation

  • supprimer entièrement les rts/wts
  • ajouter la gestion des droits dans l'api beacon (ajout/suppression d'utilisateur pour un beacon donné)
  • les api de création de vlob/block doivent contenir un champ beacon (qui sera stocké dans les informations du vlob/block et pas juste utilisé pour envoyer un signal comme actuellement)
  • lors de la consultation/modification d'un vlob/block le backend vérifie les droits d'accès

==> À réfléchir: un user manifest aura son propre beacon qui ne contiendra donc qu'un seul utulisateur et un seul vlob. Cela permet à un attaquant de simplement retrouver ces points d'entrées au système et de tenter de les déchiffrer en priorité...

comment creer une organisation

Sur la fenetre de saisie Id etc....
il faut un jeton , mais quand le premier du groupe démarre , il n'y a pas de jeton j'imagine ?
et on ne voit pas de champ :"organisation" du coup , comment le premier qui veut créer une organisation peut il demarrer

Google Driver - Store files in appData

Put the parsec files in the appData folder to avoid mistakes that could be done by the user.
Ideally :

  • debug mode : in a visible folder
  • release mode : in the appData

Droit editor/admin

Need

Seul un administrateur peut inviter de nouveaux utilisateurs.
Un administrateur peut révoquer les devices de tout le monde.
Un éditeur ne peut révoquer que ses propres devices.
(bonus) pouvoir changer un utilisateur de role (admin -> editor et editer->admin)

Implementation

  • champ role dans le document certified_user généré (et signé) par le créateur
  • le backend garde dans sa table user le role (pour y accèder facilement)
  • vérification du role lors de l'accès aux api user_create, user_invite, device_revoke

Old data cleanup system

Need

Supprimer les données d'historique trop anciennes pour libérer de la place.

Implémentation

  • api organization cleanup permettant de lister les tuples (vlobs id, version) ainsi que block id à supprimer
  • les éléments à supprimer sont juste flaggés comme tel (avec leur date de demande de suppression), ce qui les rend inaccessible ==> En cas de suppression involontaire une opération manuelle sur la base de donnée permet de revenir en arrière
  • (bonus) un script réalisant la suppression des données en vérifiant que leur date de demande de suppression est antérieur à la durée de quarantaine

==> besoin de supprimer les vieux vlobs ? (taille de données potentiellement faible, intérêt de les garder pour avoir un historique dégradé ?)

GUI: Redesign of workspaces page

  • Redesign the UI according to the new layout
  • Add workspace revokation
  • Filelist links must be clickable
  • Display long file names
  • Sort by last updated

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.