Programy P2P nie do wykorzenienia

Edward Felten, profesor informatyki na uniwersytecie w Princeton, wpadł na ciekawy sposób udowodnienia, że nie da się zniszczyć sieci wymiany plików przez delegalizowanie konkretnych aplikacji. Otóż napisał on program P2P mieszczący się w 15 liniach kodu.

Kod programu, w całości napisany jest w języku Python. Celem tej demonstracji jest pokazanie, że technologia, leżąca u podstaw sieci wymiany plików jest bardzo prosta i aplikację tego typu stworzyć jest w stanie każdy średnio zdolny programista.

Sam autor najmniejszego programu P2P na świecie potwierdza to, mówiąc „Nie stworzyłem go jako wyrazu poparcia dla łamania praw autorskich. Chodzi mi jedynie o pokazanie jak prosta koncepcja leży u podstaw aplikacji P2P i jak bezsensowne może być zabranianie ich tworzenia”.

Trzy lata temu Edwardowi Feltenowi groził proces, którego wytoczenie zapowiedziała ameryka?ska RIAA. Stało się to po tym, jak organizacja opracowała technologię „znaków wodnych”, która miała chronić muzykę przed nielegalnym rozpowszechnianiem i zachęciła hackerów do prób złamania jej. Felten udowodnił, że technologia nie jest wiele warta, zanim jednak zdołał zaprezentować wyniki swoich bada? zagrożono mu i jego pracownikom procesem sądowym. Projekt technologii zarzucono niedługo później.

Poniżej źródło wspomnianego programu:

    # 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
    myU,prs,srv = ("http://"+ar[3]+":"+ar[4], ar[5:],lambda x:x.serve_forever())
    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"))

?ródło: CDprojekt.info