diff --git a/README.rst b/README.rst index 52f2381..9b694bc 100755 --- a/README.rst +++ b/README.rst @@ -14,7 +14,10 @@ below). Content size can be limited. It uses lock which allows only one request at a time. It is implemented with bottle microframework. + It is a hack! :) +This tool was written to deceive/fool proxy which prevented me to +download usefull tools and/or source code files. Usage ===== @@ -39,19 +42,23 @@ save it to data.tar.xz: cat DATA.txt | python x.py d > data.tar.xz -Run it in development mode: +Run it in development mode using python wsgiref: .. code:: bash python x.py ANY-ARG python x.py x -Run it in production mode: +Run it in production mode using python wsgiref: .. code:: bash python x.py +Run it as apache24 wsig: + +see apache-config file for apache configuration + When you use this same tool for prepareing target URL and decrypting target content on the client then x.py need to be defined with the same AES KEY and IV values as on the server. @@ -61,6 +68,8 @@ Installation Copy bottle.py and x.py to the desired server and directory and run it. +For use with apache24 install mod_wsgi and see apache-config file for apache configuration. + Documentation ============= @@ -82,7 +91,5 @@ Further development ideas * Add configuration file. -* Add apache mod_wsgi support. - * Support defined maximum requests at a time instead of one lock. diff --git a/apache-config b/apache-config new file mode 100755 index 0000000..ea303ad --- /dev/null +++ b/apache-config @@ -0,0 +1,13 @@ + + ServerName cloak + ServerAdmin webmaster@localhost + + WSGIScriptAlias /x "/home/freebsd/x/wsgi.py" + WSGIDaemonProcess x user=www group=www python-path="/home/freebsd/x" + + + WSGIProcessGroup x + WSGIApplicationGroup %{GLOBAL%} + Require all granted + + diff --git a/wsgi.py b/wsgi.py new file mode 100755 index 0000000..44d8ea9 --- /dev/null +++ b/wsgi.py @@ -0,0 +1,6 @@ +import os + +os.chdir(os.path.dirname(__file__)) + +import x +application = x.b.default_app() diff --git a/x.py b/x.py index 146d7c2..4be88b8 100644 --- a/x.py +++ b/x.py @@ -22,12 +22,15 @@ AES_MODE = AES.MODE_CFB AES_IV = r'A123B890JKL @%#$' AES_KEY = r')(*+AKIM 313 321kjah.;klk@sfsd%$' +debug = False + py3k = sys.version_info >= (3, 0, 0) if py3k: import urllib.request as urlreq import urllib.parse as urlpar stdout_write = sys.stdout.buffer.write + def get_content_length(r): foo = r.getheader('Content-Length') if foo: @@ -39,6 +42,7 @@ else: import urllib as urlpar stdout_write = sys.stdout.write + def get_content_length(r): foo = r.info().getheaders('Content-Length') if foo and len(foo) >= 1: @@ -108,49 +112,49 @@ def x(url): aes = aes_new() return base64.b64encode(zlib.compress(aes.encrypt(x))) -argc = len(sys.argv) -if argc > 1: - aes = aes_new() - if sys.argv[1] == '-h': - print("usage: {0} -h print help".format(sys.argv[0])) - print("usage: {0} c TARGET encode TARGET".format(sys.argv[0])) - print("usage: {0} d decode stdin".format(sys.argv[0])) - print("usage: {0} ANY run server in debug mode on 8080".format( - sys.argv[0])) - print("usage: {0} run server on 80".format(sys.argv[0])) - sys.exit(0) - elif sys.argv[1] == 'c': - if argc < 3: - print("missing target") - sys.exit(1) +if __name__ == "__main__": + argc = len(sys.argv) + if argc > 1: + aes = aes_new() + if sys.argv[1] == '-h': + print("usage: {0} -h print help".format(sys.argv[0])) + print("usage: {0} c TARGET encode TARGET".format(sys.argv[0])) + print("usage: {0} d decode stdin".format(sys.argv[0])) + print("usage: {0} ANY run server in debug mode on" + "8080".format(sys.argv[0])) + print("usage: {0} run server on 80".format(sys.argv[0])) + sys.exit(0) + elif sys.argv[1] == 'c': + if argc < 3: + print("missing target") + sys.exit(1) + else: + # encode target url + if sys.argv[1] == 'c': + foo = str.encode(sys.argv[2]) + foo = aes.encrypt(foo) + foo = zlib.compress(foo) + foo = base64.b64encode(foo) + stdout_write(foo) + print() + sys.exit(0) + # decode data from stdin + elif sys.argv[1] == 'd': + foo = str.encode(sys.stdin.read()) + foo = base64.b64decode(foo) + foo = zlib.decompress(foo) + foo = aes.decrypt(foo) + stdout_write(foo) + sys.exit(0) else: - # encode target url - if sys.argv[1] == 'c': - foo = str.encode(sys.argv[2]) - foo = aes.encrypt(foo) - foo = zlib.compress(foo) - foo = base64.b64encode(foo) - stdout_write(foo) - print() - sys.exit(0) - # decode data from stdin - elif sys.argv[1] == 'd': - foo = str.encode(sys.stdin.read()) - foo = base64.b64decode(foo) - foo = zlib.decompress(foo) - foo = aes.decrypt(foo) - stdout_write(foo) - sys.exit(0) + # run dev server + host = DEV_HOST + port = DEV_PORT + debug = True else: - # run dev server - host = DEV_HOST - port = DEV_PORT - debug = True -else: - # run production server - host = PRODUCTION_HOST - port = PRODUCTION_PORT - debug = False - -b.run(host=host, port=port, debug=debug, reloader=True) + # run production server + host = PRODUCTION_HOST + port = PRODUCTION_PORT + debug = False + b.run(host=host, port=port, debug=debug, reloader=True)