08:16 <cyp> plop
09:40 <jpcw> matin café
09:41 <gawel> matin
09:49 <feth> Bonjour
09:51 <morgan`> hello
11:05 <NelleV_> Bonjour
11:05 <gawel> coucou
15:31 <tarek> haypo: ping
15:31 <haypo> tarek: pong
15:31 <tarek> haypo: je test pysandbox et j'ai des questions
15:32 <tarek> j'ai besoin de loader un module puis de lister les elements qu'il contient, puis eventuellement de les executer
15:32 <tarek> pysandbox permet l'execution directe
15:32 <tarek> mais est ce qu'il permet de renvoyer un objet module
15:34 <haypo> "import module"" est autorisé dans pysandbox, ça renvoie un faux module
15:35 <haypo> dir(module) ne liste que les symboles autorisés par ta politique de sécurité
15:35 <tarek> mmm
15:36 <haypo> il me semble que dir() marche bien mieux avec Python 2.6 pour pysandbox ;:)
15:37 <tarek> et compile() existe ?
15:37 <tarek> car j'ai un fichier
15:37 <haypo> tarek: tu peux autoriser compile() oui
15:38 <tarek> haypo: bon je vais essayer
15:38 <tarek> en fait il me faut un boostrap si j'ai bien compris
15:39 <tarek> un bout de python qui renvoie un module avec un appel a compile() dans la sandbox
15:39 <haypo> euh
15:39 <haypo> le code non sûr doit être exécuté dans la sandbox
15:40 <tarek> je vais faire un snippet pour te montrer
15:40 <haypo> tarek: c'est la feature 'code' qui autorise compile()
15:41 <haypo> je reboote et je reviens de suite
15:51 <haypo> tarek: pysandbox est encore un projet expérimental, qui manque de doc
15:51 <haypo> je ne comprends pas moi même exactement comment il fonctionne :)
15:51 <haypo> mais avec un exemple de code, je devrais pouvoir t'en dire plus ;)
16:13 <tarek> haypo: ouai j'ecris ca
16:14 <tarek> j'essaye de me rappeler comment passer d'un objet code a un objet module
16:14 <haypo> un objet code n'est pas dangeureux
16:15 <haypo> par contre, pysandbox interdit de crée un objet code arbitraire :-p
16:17 <tarek> j'essaye de passer d'une string qui represente le contenu d'un fichier, vers un module
16:19 <haypo> tarek: et ça marche ou pas ?
16:19 <tarek> ben j'essaye deja en python pur
16:19 <tarek> j;ai oublie comment faire
16:19 <haypo> je ne vois pas ce que tu veux dire par "passer une chaîne à un module"
16:20 <tarek> j'ai dis ca moi ?
16:21 <haypo> "j'essaye de passer d'une string qui represente le contenu d'un fichier, vers un module" je n'ai pas compris ça
16:21 <tarek> s = "def hello(): return 'hello'"
16:21 <tarek> ca c'est une chaine
16:21 <tarek> qui represente du code
16:22 <tarek> je veux creer un oject module avec
16:22 <tarek> j'essaye imp.load_source
16:23 <haypo> import sys; mod=type(sys)('name'); compile(code, '<string>', 'exec') in mod.__dict__ # gruik
16:23 <tarek> gni
16:25 <tarek> compile(code, '<string>', 'exec') ca renvoie un objec code
16:25 <tarek> apres je sais pas comment creer un objet module avec
16:28 <tarek> ah j'ai trouve
16:28 <tarek> module 'new'
16:28 <gawel> m = types.ModuleType()
16:29 <tarek> par contre, mmm comment le remplir
16:29 <tarek> gawel: ouai ou types. tiens new est plus dans py3
16:29 <gawel> setattr
16:29 <tarek> gawel: mmm, j'ai le contenu dans un object 'code'
16:29 <gawel> ou exec in mod.__dict__ comme disait haypo
16:30 <tarek> mmm
16:30 <tarek> non ca colle pas ca
16:31 <tarek> exec in mod.__dict__ ca renvoie un boolean
16:31 <tarek> compile(code, '<string>', 'exec') ca renvoie un objet code
16:31 <tarek> ce qui me manque c'est letape ou l'objet module est remplie avec l'objet code
16:32 <tarek> j'ai l'impression que je me prends la tete pour rien
16:32 <gawel> je crois aussi
16:32 <tarek> module = load_module_from_string(string) !!
16:32 <tarek> c'est cette fonction que je cherche
16:32 <tarek> module = load_module_from_string(module_name, string)
16:33 <tarek> dans imp il y a tout mais avec les fichiers
16:35 <tarek> Ah!
16:35 <tarek> http://code.activestate.com/recipes/82234-importing-a-dynamically-generated-module/
16:35 <tarek> en fait c'est presque ce que haypo disais
16:36 <tarek> sauf que compile(code, '<string>', 'exec') != code = compile(code, '<string>', 'exec'); exec code in mod.__dict__
16:37 <haypo> tarek: arg, j'ai loupé "exec "dans mon copier-coller
16:37 <haypo> import sys; mod=type(sys)('name'); exec compile(code, '<string>', 'exec') in mod.__dict__ # gruik
16:38 <tarek> bon ca marche
16:38 <haypo> mod=type(sys)('name') <=> mod = types.ModuleType('name')
16:39 <tarek> http://tarek.pastebin.mozilla.org/1333926
16:39 <tarek> etape 1: done
16:39 <tarek> etape 2: haypo, comment passer a pysandbox dans cet exemple ?
16:39 <haypo> tarek: c'est quoi que tu veux exécuter dans pysandbox ?N
16:40 <tarek> l'exec
16:40 <tarek> de maniere a loader le module dans la sandbox
16:40 <tarek> puis par la suite l'execution de ses elements
16:40 <haypo> tarek: hum. pysandbox ne protège que le code exécuté dans pysandbox
16:41 <tarek> ok. donc, comment executer ce code dans pysandbox ?
16:41 <haypo> tu peux pas charger une module dangeureux dans pysandbox puis l'exécuter en dehors de pysandbox
16:41 <tarek> j'ai pas l'intention de l'executer en dehors
16:42 <haypo> tarek: à la fin, que fais-tu de ton module ? tu exécutés quoi ? une fonction porécise ?
16:42 <haypo> précise*
16:42 <tarek> peut etre qu'il manque une abstraction
16:42 <tarek> n'importe quelle fonction dedans
16:42 <tarek> e.g.
16:42 <tarek> module = SandBoxedModule(name, code)
16:42 <tarek> module.la_func()
16:43 <tarek> tu connais zope ?
16:43 <tarek> ou alors:
16:43 <haypo> non :)
16:43 <tarek> sandbox.run(module, function, args)
16:43 <tarek> dans zope il ya RestrictedPython
16:43 <tarek> qui permet d'utiliser des objets "Python"
16:43 <tarek> c'est un peu l'idee
16:44 <tarek> je veux pouvoir loader dynamiquenent des "modules" virtuels
16:44 <tarek> contenant des fonctions
16:44 <tarek> et appeler ces fonctions
16:46 <tarek> c'est pour ca que je parlais de bootstraping tout a l'heure
16:46 <tarek> e.g. la creation de modules dans la sandbox, puis leurs appels
16:47 <haypo> tar http://tarek.pastebin.mozilla.org/1333930
16:47 <haypo> tarek: http://tarek.pastebin.mozilla.org/1333930
16:48 <haypo> ça pête car écrire dans stdout est dangeureux ! (interdit par la politique par dfaut)
16:48 <haypo> utilise config = SandboxConfig('stdout', 'code') pour autoriser print
16:49 <tarek> ah cool, extra !
16:49 <haypo> pas besoin de créer un module
16:49 <haypo> il te faut juste un espace de nom (dico namespace ici)
16:49 <tarek> au final j'ai une classe qui publie call(nom_fonction, args)
16:50 <tarek> ouai c parfait ca
16:50 <tarek> nickel
16:50 <tarek> j'implemente
16:50 <tarek> thx
16:51 <haypo> normalement, .execute() est safe si tu ne passes rien de dangeureux dans locals
16:51 <haypo> il utilise globals={} pour n'avoir aucune variable glboale
16:51 <haypo> tarek: je suis impressioné que ça marche, je pensais que ton use case n'était pas géré :)
16:51 <haypo> si ça marche bien, faudrait que je l'ajoute en exemple
16:51 <tarek> je suis ravi alors
16:52 <tarek> mon use case final:
16:52 <tarek> creation de web services avec redbarrel,
16:52 <tarek> definition avec le dsl du service
16:52 <tarek> et upload de "libs" python (modules)
16:52 <haypo> bon, je vais pouvoir rajouter des portes dérobées pour rooter mozilla alors
16:52 <tarek> puis link des libs dans le dsl
16:52 <tarek> bah, ca va tourner dans des VMs
16:52 <tarek> mais il me faut une sandbox pour l'UI surtout
16:53 <tarek> pour pouvoir prevenir le user etc
16:53 <haypo> tarek: le fichier README de pysandbox liste les limitations (et failles possibles)
16:53 <tarek> ok, je vais voir
16:53 <tarek> la c du prototypage mais
16:53 <tarek> a terme, j'aimerais supporter JS aussi
16:54 <haypo> je pense qu'il y a des outils plus élaborés (simples?) pour sandboxer javascript
16:54 <tarek> vla le proto: http://ziade.org/redbarrel.mpeg
16:54 <tarek> aucune idee
16:54 <tarek> dans le proto tout est fonctionel. me manque juste l'upload de code pour creer des libs
16:56 <haypo> attention ! parfois les proto partent en prod :)
16:56 <haypo> une conf en a parlé à pycon fr
16:56 <tarek> ahaha
16:56 <tarek> bah
16:57 <tarek> ca me derangerais oas
16:57 <tarek> du moment que c'est une VM
16:59 <tarek> haypo: call() peut passer des arguments ?
17:03 <tarek> oui
17:03 <tarek> bon bah ca marche nickel
17:07 <tarek> haypo: vala: http://tarek.pastebin.mozilla.org/1333933
17:28 <haypo> tarek: tu peux éviter __text en écrivant le texte directement dans l'argument passé à sandbox.execute()
17:28 <haypo> 'exec compile(%r, "<string>", "exec")' % code # encore plus gruik !
17:34 <encolpe> miam
17:34 <encolpe> ça marche avec eval ?
17:35 <haypo> encolpe: pysandbox autorise eval(), mais eval() ne permet pas de définir une fonction (hello)
17:38 <haypo> je lis douvent qu'eval est dangeureux, mais en fait non
17:38 <haypo> eval() n'autorise pas import, def, ou autre
17:39 <haypo> exec+compile() est bien plus dangeureux :)
17:39 <encolpe> :)
17:39 <haypo> >>> eval('import os')
17:39 <haypo> SyntaxError: invalid syntax
17:39 <haypo> >>> eval('1+1')
17:39 <haypo> 2
22:13 <No`> .o/
22:36 <tarek> benoitc: ping
22:39 <benoitc> pong
23:02 <tarek> benoitc: c'est 1.5 millions actives, 4 millions registered
23:03 <benoitc> tarek: k je vais remplacer
23:03 <benoitc> ya d'autres trucs à revoir aussi
23:03 <tarek> ok
23:04 <tarek> je fini un truc et je suis a toi
23:04 <benoitc> enfonin là je re dans 4h
23:04 <benoitc> mmm
23:04 <benoitc> je vais dormir un peu ..
23:18 <tarek> benoitc: http://ziade.org/redbarrel2.mpeg
23:21 <haypo> bonjour gevent ! bonjour <cookie en clair> !
23:22 <haypo> ah ah, ça me rappelle une conférence avec une clé en clair :)
23:24 <tarek> gni ?
23:24 <haypo> tarek: ton webservice affiche potentiellement des infos sensibles, non ?
23:24 <haypo> dumoins, dans ta vidéo :)
23:24 <tarek> a oui c juste une demo
23:25 <haypo> en tout cas, on dirait que ça marche
23:25 <tarek> c pour montrer que la fonction recoit la rquete
23:25 <misc> amusant, mplayer boucle sur la video
23:25 <tarek> a oui moi auissi
23:27 <tarek> haypo: oui nickel la sandbox :D
23:27 <tarek> l;etape d'apres c la meme en js
23:27 <haypo> misc: pas ici