P2P In 15 Lines of Code 418
nile_list writes "Edward Felten of the very fine Freedom to Tinker has written a 15 line P2P program in Python. From the post on Freedom to Tinker, "I wrote TinyP2P to illustrate the difficulty of regulating peer-to-peer applications. Peer-to-peer apps can be very simple, and any moderately skilled programmer can write one, so attempts to ban their creation would be fruitless." Matthew Scala, a reader of Freedom to Tinker, has responded with the 9 line MoleSter, written in Perl."
Actually, yes. (Score:5, Informative)
Re:P2P Does Not Break the Law (Score:3, Informative)
Consider: Usenet, 1979.
Parent is -1, Redundant (Score:5, Informative)
You're using Socket.pm, and it's huge, that's cheating!
Read the fucking code. I'm only using Socket.pm for its defined constants (such as SOCK_STREAM). I could easily eliminate Socket.pm, and save probably another 20 bytes or so, by replacing those constants with the numbers they represent; I have not done so yet only for portability's sake - it might make my code Linux-specific and I'd like to avoid that.
Re:I can beat that (Score:2, Informative)
Re:Both these programs are full of BS (Score:2, Informative)
This year saw the 17th International Obfuscated C Code Contest. There's some fun stuff in there.
A more legible version of tinyp2p.py (Score:5, Informative)
# tinyp2p.py 1.0 (documentation at http://freedom-to-tinker.com/tinyp2p.html)
import sys, os, SimpleXMLRPCServer, xmlrpclib, re, hmac # (C) 2004, E.W. Felten
ar, pw, res = (sys.argv, lambda u:hmac.new(sys.argv[1],u).hexdigest(), re.search)
pxy, xs = (xmlrpclib.ServerProxy, SimpleXMLRPCServer.SimpleXMLRPCServer)
def ls(p=""):
return filter(
lambda n: (p == "") or res(p, n),
os.listdir(os.getcwd()))
if ar[2] != "client": # license: http://creativecommons.org/licenses/by-nc-sa/2.0
def pr(x=[]):
return ([(y in prs) or prs.append(y) for y in x] or 1) and prs
def c(n):
return ((lambda f: (f.read(), f.close()))(file(n)))[0]
f = lambda p, n, a: \
(p == pw(myU)) and (((n == 0) and pr(a)) or ((n == 1) and [ls(a)]) or c(a))
def aug(u):
return ((u == myU) and pr()) or pr(pxy(u).f(pw(u), 0, pr([myU])))
pr() and [aug(s) for s in aug(pr()[0])]
(lambda sv: sv.register_function(f, "f") or srv(sv))(xs((ar[3],int(ar[4]))))
for url in pxy(ar[3]).f(pw(ar[3]), 0, []):
for fn in filter(lambda n: not n in ls(), (pxy(url).f(pw(url), 1, ar[4]))[0]):
(lambda fi: fi.write(pxy(url).f(pw(url), 2, fn)) or fi.close())(file(fn, "wc"))
Ruby solution, six lines, more secure (Score:1, Informative)
I think the Python solution has a security bug that allows attackers to retrieve all files that the user under which the server is run has access to by supplying a filename like "../foo". Here's a replacement version in Ruby:
I'm using DRb, a library for OOP-style remote procedure calls, instead of XML-RPC.
In case this posting gets slashdotted or screwed up by the crazy space insertation engine the code is also available here. (with syntax highlighting!) [rafb.net]
Oh, and for the trolls: I usually don't write obfuscated, golfed Ruby code, but the language certainly won't stop me from doing so when I need to do so for reasons of holy language wars.