~azzar1/unity/add-show-desktop-key

95 by mattgiuca
Moved some things out of www into their respective dirs, console and
1
#!/usr/bin/python
2
3
# usage:
4
#   python-console <port> <magic>
5
6
import web
7
import md5
8
import codeop
9
import cjson
10
11
globs = {}
12
globs['__builtins__'] = globals()['__builtins__']
13
locls = {}
14
compiler = codeop.CommandCompiler()
15
curr_cmd = ''
16
17
def do_chat(txt):
18
    if curr_cmd == '':
19
        curr_cmd = txt
20
    else:
21
        curr_cmd = curr_cmd + '\n' + txt
22
    try:
23
        cmd = compiler(curr_cmd)
24
        if cmd is None:
25
            # The command was incomplete,
26
            # so send back a None, so the
27
            # client can print a '...'
28
            web.output(cjson.encode(None))
29
        else:
30
            # The command was complete,
31
            # so evaluate it!
32
            out = cStringIO.StringIO()
33
            sys.stdout = out
34
            sys.stderr = out
35
            signal.alarm(5)
36
            res = eval(cmd, globs, locls)
37
            signal.alarm(0)
38
            v = (out.getvalue(), res, None)
39
            web.output(json.encode(v))
40
            curr_cmd = ''
41
    except Exception, exc:
42
        v = (None, None, str(exc))
43
        web.output(json.encode(v))
44
        curr_cmd = ''
45
46
urls = (
47
    '/',            'index',
48
    '/(.*\.js)',    'jscript',
49
    '/(.*\.css)',   'style',
50
    '/chat',        'chat')
51
52
# The global 'magic' is the secret that the client and server share
53
# which is used to create and md5 digest to authenticate requests.
54
# It is assigned a real value at startup.
55
magic = ''
56
57
class index:
58
    def GET(self):
59
        inp = web.input()
60
61
        # Authenticate
62
        digest = md5.new('hello' + magic).digest().encode('hex')
63
        if inp.digest != digest:
64
            web.ctx.status = '401 Unauthorized'
65
            return
66
67
        # Okay, so the authentication succeeded,
68
        # so all we need to do is send back the static
69
        # HTML for the console app.
70
        web.output(file("index.html", "r").read())
71
72
class jscript:
73
    def GET(self, name):
74
        web.output(file(name, "r").read())
75
76
class style:
77
    def GET(self, name):
78
        web.output(file(name, "r").read())
79
80
class chat:
81
    def POST(self):
82
        inp = web.input()
83
84
        # Authenticate
85
        digest = md5.new(inp.text + magic).digest().encode('hex')
86
        if inp.digest != digest:
87
            web.ctx.status = '401 Unauthorized'
88
            return
89
90
        # Okay, so the authentication succeeded,
91
        # so now we have the trivial matter of actually
92
        # executing the python....
93
        web.output(do_chat(inp.text))
94
95
if __name__ == "__main__":
96
    # FIXME jail!
97
    magic = sys.argv[2]
98
    web.run(urls, globals())