Sam & Max: Python, Django, Git et du cul » 0bin http://sametmax.com Deux développeurs en vadrouille qui se sortent les doigts du code Wed, 05 Feb 2014 14:20:37 +0000 en hourly 1 http://wordpress.org/?v=3.3.1 Première requête de take down pour 0bin http://sametmax.com/premiere-requete-de-take-down-pour-0bin/ http://sametmax.com/premiere-requete-de-take-down-pour-0bin/#comments Tue, 09 Jul 2013 06:21:01 +0000 Sam http://sametmax.com/?p=6597 Vous vous souvenez, 0bin, ce pastebin chiffré côté client écrit en Python ? Le but était de protéger, non pas l’utilisateur, mais l’hébergeur, d’une attaque en justice. La théorie est qu’il ne peut en effet être tenu de modérer ce qu’il ne peut consulter.

Et bien on vient de recevoir notre première demande légale de retrait de liens.

Petit retour sur les faits, pistes de réflexion et appel à commentaires.

Le take down

La demande ne nous est pas parvenue directement, ni même par notre hébergeur, mais via notre fournisseur de nom de domaine, en l’occurrence pour 0bin.net, l’américain namecheap.

Techniquement, nous ne sommes pas aux USA, et nos serveurs ne le sont pas non plus. Pour Max, “c’est idiot de se prendre un procès pour un site qui rapporte pas”. Moi je dirais plutôt que le risque, c’est de perdre le nom de domaine qui est quand même super cool, mais ma première réaction a plutôt été “nannnnnnn, faut pas censurer”. Au final, on quand même retiré les pastes, puisqu’ils contenaient des liens de téléchargement de contenus protégés par le droit d’auteur.

Voici les demandes que nous avons reçu :

2.) Identify the copyrighted work claimed to have been infringed
You link to this copyrighted material (music albums):

DANNY PRESZ – Inicio – (2013)
ORQUESTA BRONKO & SHAKAITO – 30 Aniversario-Homenaje – (2013)
CHARLIE CRUZ – Huellas – (2013)
MONGORAMA – Baila Que Baila – (2013)
CONJUNTO SABROSURA – Moña Pa’ Mi Bongó – (2013)
V. A. – Sergio George’s Salsa Giants – (2013)
Victor Manuelle – Me Llamaré Tuyo – (2013)

3.) Provide us the exact location of the infringing file with the exact link
On your servers here (re-directing to 180upload.com):

http://0bin.net/paste/7eefb6647bb1e606ef95eaa219e4f2de8ef98d5a#GipoKK++q7p3t+56MQPQa7Tm50Vq3BTATm0a9CsiBE0=

http://0bin.net/paste/d3d3db7281b32d1d9ba4be1f0166c0e6681b7904#yuYfcO5g83WDQ7xgF8l39AhHJH4N+XfzMv6Th1IoiVo=

http://0bin.net/paste/4185de7d1d5acc69f149472edb6395603786e622#s22bq9IkdWlm7vajb4+ryNvQLAe79tYZqrICzaexw1E=

http://0bin.net/paste/df3bf3537bec0d54c1fc2d469307d91674172072#uTszh1/Om8baR/hsvWpLyMm50vgwRoRRsMkMbgVouTo=

http://0bin.net/paste/1cbb4a2796db7015412353e9cc6818cd16673338#spj9KqFNfCeMR/VNN5IVof4Sax9njevkcIBuesNWTmE=

http://0bin.net/paste/f67fd84d81bdfeb5da8a529a1064d143c8831fe6#uadJcY9uIaGbJ7oXUZ8kcXXpiktHjwkhE9XUH3TC+9U=

http://0bin.net/paste/a1043ecdf4fe1d1a4d55aedc5d9409f1767223ef#QaT1pCopGaxs9ZC07N+0cmVg6aRoiL9uY3GOPvuUx7w=

4.) Provide us the web address under which the link has been published
The links are shared here in public:

http://bypachayo.blogspot.de/

J’ai groupé les mails en un seul, mais il y en a eu 3. Notez qu’ils avaient accès aux liens avec la clé de chiffrement, puisqu’ils étaient posté publiquement sur un blog. De plus, l’identification a probablement été manuelle étant donné la nature de 0bin.

L’état de 0bin

0bin n’est pas un outil de lutte contre la censure ou de contournement légal. Il n’est pas armé pour le cas où la demande de take down arrive avec le lien complet, clé incluse, car il a été exposé ainsi sur le Net.

Il ne permet pas non plus de prévenir l’utilisateur du retrait de ses liens : tout le monde va tomber sur une 404 jusqu’à ce que l’auteur soit averti, et il ne comprendra pas ce qui s’est passé.

Ici, on a eu la chance d’avoir un seul blog, donc je suis allé poster un commentaire dessus pour lui expliquer la situation. Mon espagnol est un peu rouillé d’ailleurs.

On voit aussi que 0bin, et Internet en général, est mal compris : le mec utilisait l’outil pour poster un lien par paste, qu’il linkait ensuite sur son site. Qu’espérait-il ? Camoufler quelque chose ? A-t-il compris comment marchait le service ? A quoi il était destiné ?

La seule bonne nouvelle dans tout ça, c’est qu’on a rajouté un script qui supprime permet de supprimer un paste en Python.

Et après ?

Même si les liens étaient illégaux (d’ailleurs je n’ai aucune connaissance pour vérifier que l’injonction de retrait est elle, légale), cela fait toujours un peu chier de devoir retirer quelque chose. Cette fois, on n’a pas recopié l’information ailleurs, mais peut être qu’on aurait dû.

La vraie question c’est : est-ce qu’on veut ajouter des fonctionnalités de résistance contre la censure à 0bin ? Est-ce que ce but est vraiment complémentaire à l’objectif initial ? Est-ce que les utilisateurs en ont besoin ? Est-ce que ça ne va pas transformer le logiciel en un truc qui n’a rien à voir ?

Et si oui, que mettre en place ? De mon chapeau, j’ai déjà quelques idées :

  • Mettre en place une instance sur Tor et faire un script ou une fonctionnalité de transfert sur celle-ci en cas de take down notice.
  • Ajouter de la réplication, et lier plusieurs instances qui se font confiance entre elles via une API.
  • Ajouter une fonctionnalité de liens périssables (temps, nombre de cliques…), pour que les gens puissent partager des liens de 0bin des pages publiques sans donner l’URL réelle.
  • Permettre un faux retrait, c’est à dire un retraire temporaire, mais les liens sont réactivés plus tard ?
  • Pouvoir protéger un paste par un mot de passe.

Mais rien de tout ça ne règle le problème de notre cher fan de Danny Presz. D’ailleurs faut-il résoudre son problème ? Et si oui, est-ce le rôle de 0bin ?

J’ai horreur de terminer une article comme ça, ça fait vraiment pute à commentaires sur un blog cheap, mais qu’est-ce que vous en pensez ?

flattr this!

]]>
http://sametmax.com/premiere-requete-de-take-down-pour-0bin/feed/ 43
Nous avons mis puis enlevé Piwik sur 0bin http://sametmax.com/nous-avons-mis-puis-enleve-piwik-sur-0bin/ http://sametmax.com/nous-avons-mis-puis-enleve-piwik-sur-0bin/#comments Tue, 23 Oct 2012 14:37:20 +0000 Sam http://sametmax.com/?p=2717 0bin. C'était une mauvaise idée.]]> Par curiosité nous voulions savoir combien de personnes allaient sur 0bin. C’était une mauvaise idée.

On ne pouvait pas utiliser Google Analytics car ça aurait émoussé la confiance des utilisateurs, alors on a installé notre propre instance de Piwik: une solution open source sur laquelle du coup nous avions la main du code en passant par le serveur.

Malheureusement, en regardant les stats détaillées, j’ai remarqué que Piwik sauvegardait chaque URL avec l’ancre, donc avec la clé de chiffrement. J’avais dans ma base de données une liste d’URLs menant à des pastes dont je pouvais lire le contenu.

Cela pose plusieurs problèmes:

  • si vous êtes hébergeurs de 0bin, vous voulez éviter ça à tout prix. Le but est justement ne pas pouvoir faire ça, car on parie sur le fait que ce qu’on ne peut pas être légalement tenu de modérer ce qu’on ne peut pas lire.
  • si vous êtes utilisateurs, tout l’intérêt de ce qui fait 0bin autre chose qu’un simple pastebin s’écroule

J’ai tout supprimé, mais c’est vraiment un coup de bol que je m’en sois aperçu, car je n’avais même pas imaginé que juste pour des stats on pourrait enregistrer jusqu’à l’ancre d’une URL. Et je n’ai certainement pas cherché ces URLs, qui n’étaient pas mises en avant dans ma configuration du tableau de bord.

Moralité:

  • si vous êtes hébergeurs, n’installez rien sur 0bin. Rien du tout. On ne peut jamais être parfaitement certain de ce que fait un outil tierce partie, fut-il open source. Si je n’avais pas ouvert par hasard ce sous-sous-sous-menu, je n’aurais pas vu le problème, et aurait pu accumuler ces URLs pendant des mois.
  • si vous êtes utilisateurs, faites bien attention à ce que l’outil ne comporte rien en plus. Un petit view source est de rigueur. Si quelqu’un peut nous pondre une extension pour vérifier le JS, encore mieux…

flattr this!

]]>
http://sametmax.com/nous-avons-mis-puis-enleve-piwik-sur-0bin/feed/ 11
L’indentation de Python m’a tuer http://sametmax.com/lindentation-de-python-ma-tuer/ http://sametmax.com/lindentation-de-python-ma-tuer/#comments Thu, 09 Aug 2012 13:01:31 +0000 Sam http://sametmax.com/?p=1568 J’adore le fait que Python se base sur des espaces pour délimiter les blocs de code. La seule contrainte que cela a jusqu’ici posé, c’est que les blocs ne peuvent pas être passés en arguments.

Aujourd’hui pourtant, ce système si merveilleux nous a bien fait chier pendant une demi-heure.

Cas simple: Max me file un snippet bien racheux dans 0bin. Je clic sur “copy to clipboard”, j’élague la fonction des loggers et des try/catch qui attrapent tout, même un rhûme, et je lance des tests.

  File "truc.py", line 35
     
    ^
SyntaxError: invalid syntax

Quid ?

Je cherche, je recherche, je creuse, je retourne, je m’enfonce.

Passage en mode fourmis.

Je retire des blocs. Des lignes une a une. Des combinaisons des deux. Des combinaisons arbitraires, aléatoires de blocs transposés dans un autre fichier après conversion en utf-8 et des tabs en espaces.

  File "truc.py", line racine de 12
     
    ^
SyntaxError: invalid syntax

Je prends Max a témoin.

Nous cherchons. Nous recherchons. Nous creusons. Je m’énerve.

Ce putain de code DOIT marcher. Il n’y a AUCUNE putain d’erreur de syntax là dedans.

Puis eureka, je copie et je colle le texte comme string dans le shell Python.

Lumière:

>>>"""def download(url, dest_path, progress_callback=lambda x, y: 0, proxy=None, block_sz=8192):
...         
...          
...             if proxy is not None:
...                         # build a new opener that uses a proxy requiring authorization
...                         proxy_support = urllib2.ProxyHandler({"http" : proxy})
...                         opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
...                  
...                         # install it
...                         urllib2.install_opener(opener)
...                  
...                     u = urllib2.urlopen(url, timeout=30)
...                     f = open(dest_path, 'w')
...                  
...                     meta = u.info()
...                 
...                     file_size = int(meta.getheaders("Content-Length")[0])
...                  
...                     block_sz = file_size_dl = 8192
...                     buffer  = u.read(block_sz)
...                     previous_status = ()
...                  
...                     while buffer:
...                          
...                                 file_size_dl += block_sz
...                                 f.write(buffer)
...                                 status = (file_size_dl, file_size_dl * 100. / file_size)
...                                 if status != previous_status:
...                                 """    
...            
 
'\ndef download(url, dest_path, progress_callback=lambda x, y: 0, proxy=None, block_sz=8192):\n    \n    \xc2\xa0\n        if proxy is not None:\n                # build a new opener that uses a proxy requiring authorization\n                proxy_support = urllib2.ProxyHandler({"http" : proxy})\n                opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)\n        \xc2\xa0\n                # install it\n                urllib2.install_opener(opener)\n        \xc2\xa0\n            u = urllib2.urlopen(url, timeout=30)\n            f = open(dest_path, \'w\')\n        \xc2\xa0\n            meta = u.info()\n        \n            file_size = int(meta.getheaders("Content-Length")[0])\n        \xc2\xa0\n            block_sz = file_size_dl = 8192\n            buffer  = u.read(block_sz)\n            previous_status = ()\n        \xc2\xa0\n            while buffer:\n            \xc2\xa0\n                    file_size_dl += block_sz\n                    f.write(buffer)\n                    status = (file_size_dl, file_size_dl * 100. / file_size)\n                    if status != previous_status:\n                            previous_status = status\n                            progress_callback(*status)\n                \n                        buffer = u.read(block_sz)\n                \xc2\xa0\n                \xc2\xa0\n                    f.close()\n                \xc2\xa0\n                '

Mais quel est ce petit salopard de “\xc2\xa0″ ?

In [2]: print "a\xc2\xa0b"
a b


Caractère utf8 pour “espace insécable”
.

Pour Sublime Text et 0bin, se sont des espaces comme les autres. Pour Python, c’est une syntax error.

Fuck.

La coloration syntaxique de 0bin doit sans doute insérer ce truc à chaque saut de ligne. Du coup on a patché tout ça, les sources sont à jour sur github et j’en ai profité pour updater le paquet sur pypi qui est maintenant la dernière en date avec tous les goodies: détection de code source, send by mail, compteur, etc.

flattr this!

]]>
http://sametmax.com/lindentation-de-python-ma-tuer/feed/ 17
0bin, implémentation Python de zerobin (pastebin chiffré côté client) http://sametmax.com/0bin-implementation-python-de-zerobin-pastebin-chiffre-cote-client/ http://sametmax.com/0bin-implementation-python-de-zerobin-pastebin-chiffre-cote-client/#comments Sat, 19 May 2012 15:42:49 +0000 Sam http://sametmax.com/?p=656 Max et moi on a merdé beaucoup plus de projets originaux que tout le reste. Du coup pour se remonter le moral, on se fait régulièrement un bon plagiat d’un truc qui marche. C’est terrible d’avoir plus de succès avec les idées des autres que les siennes :-)

Dans la lignée de nos flateries (puisque la copie en est la plus haute forme), voici 0bin, une implémentation Python du projet zerobin. Encore un truc de Sebsauvage. Promis après ça on arrête.

Capture d'écran du logiciel 0bin

0bin.net

Pour faire bonne mesure, c’est du libre sous licence WTF, il y a une doc en français, et le code source est  sur github. Si vous ne connaissez pas Python, c’est facile à installer. Si vous connaissez Python:

pip install zerobin && zerobin

C’est de la version beta alpha planta, donc rapportez-nous les bugs.

Le principe

C’est un pastebin ordinaire, vous collez du code, vous récupérez une URL, et vous l’envoyez à votre voisin qui peut ainsi le lire.

Le petit plus, c’est qu’il est chiffré côté client. C’est à dire que l’hébergeur (ici nous) ne peut pas lire ce que vous postez.

En plus de ça, on a rajouté quelques goodies:

  • coloration syntaxique automatique (pas besoin de préciser le langage);
  • historique des pastes précédents (sur votre navigateur uniquement);
  • upload (plutôt que de faire un gros copier/coller);
  • burn after reading: le paste ne peut être lu qu’une fois;
  • short url et copier dans le presse papier.

On à même réussi à caser VizHash.js là dedans !

Les grands absents (contrairement à zerobin), ce sont les commentaires. En analysant bien le truc, on s’est apperçu que c’était la porte ouverte à toutes les fenêtres, donc on a fait sauté la feature, d’autant que nous ne commentons jamais nous même nos pastes. On a un chat chiffré pour ça.

 

flattr this!

]]>
http://sametmax.com/0bin-implementation-python-de-zerobin-pastebin-chiffre-cote-client/feed/ 11