
참고: 이 페이지는 시간 나는 대로 갱신되고 있습니다. 심심할 때마다 한 두 번씩 오세요 :)
파이썬으로 만든 15줄짜리 P2P 프로그램인 TinyP2P의 버그 하나를 잡고 최대한 줄여 만든 9줄짜리 프로그램입니다. TinyP2P에 대한 자세한 설명은 제 블로그를 참고하세요.
무려 /.에도 올라 가 있습니다. -_-;
이 코드는 여기서도 받을 수 있습니다.
import sys,os,SimpleXMLRPCServer as S,xmlrpclib as L,re,hmac;T=lambda x=[]:([(y
in s)or s.append(y)for y in x],s)[1];f=lambda p,n,a:p==P(M)and{0:T,1:lambda a:[U
(a)]}.get(n,lambda n:L.Binary(file(n,'rb').read()))(a);U=lambda p='':[n for n in
os.listdir(os.getcwd())if re.search(p,n)];O=lambda u:(u==M and T())or T(X(u).f(P
(u),0,T([M])));P=lambda u:hmac.new(V[1],u).hexdigest();V=sys.argv;M="http://"+V[
3]+":"+V[4];X=L.ServerProxy;s=V[5:];"server"!=V[2]and([[file(F,"wb").write(X(l).
f(P(l),2,F).data)for F in[i for i in X(l).f(P(l),1,V[4])[0]if not i in U()]]for
l in X(V[3]).f(P(V[3]),0,[])],sys.exit(0));i=S.SimpleXMLRPCServer((V[3],int(V[4]
)));T()and map(O,O(T()[0]));i.register_function(f,"f")or i.serve_forever();('_')
이 프로그램의 사용법은 TinyP2P 홈페이지에 자세히 설명되어 있지만 영어에 알레르기-_-가 있으신 분을 위해서 대충 설명하겠습니다.
이 프로그램은 크게 서버와 클라이언트, 두 모드로 구성되며, 서버의 경우 공유 서버와 파일을 실제로 갖고 있는 파일 서버(peer)로 다시 나뉩니다. 일단 공유 서버에서는 다음과 같은 명령을 내립니다.
$ python tinyp2p.py just_another_python_hacker server tokinize.net 1337
첫 인자는 네트워크에 접근하기 위한 암호이며, 둘째는 항상 "server", 셋째와 넷째는 각각 서버의 호스트 이름과 포트 번호입니다. 일단 공유 서버가 돌아 가고 있으면 peer들은 다음과 같은 명령으로 현재 디렉토리에 있는 파일들을 공유할 수 있습니다.
$ python tinyp2p.py just_another_python_hacker server tokigun.net 1337 http://tokinize.net:1337
보시는 바와 같이 공유 서버의 인자가 하나 추가되었습니다. 사용자는 다음과 같은 명령으로 파일을 받아 올 수 있습니다.
$ python tinyp2p.py just_another_python_hacker client http://tokinize.net:1337 Python-2\.4\.tgz
첫 인자는 네트워크 암호, 둘째는 항상 "client", 셋째는 서버 주소, 넷째는 파일 이름입니다. 파일 이름은 파이썬 정규표현식으로 표현되므로 점(.)을 나타내기 위해서는 앞에 \를 붙여 줘야 합니다. -_-; 위와 같이 실행할 경우 파이썬 정규표현식에 맞는 모든 파일이 검사되며, \.tgz라고만 한다면 ".tgz"가 포함된 모든 파일을 받게 됩니다. (물론 실제로 쓰기에는 부적당합니다-_-)
이 버그들은 대부분 TinyP2P의 원래 버전에서도 존재하는 버그들입니다.