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

« back to all changes in this revision

Viewing changes to src/bin/python-server

  • Committer: mattgiuca
  • Date: 2007-12-18 22:39:21 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:78
Added new config files: mimetypes and apps/server.
    These relate to configuring additional mime types and listing the
    interpreters and whitelist of servable file types.
common/util.py: Now sets up the mime types according to conf.mimetypes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/python
2
2
 
3
 
# Notes
4
 
# -----
5
 
#
6
 
# 1. execute in a chroot jail
7
 
# 2. enforce resource limits
8
 
# 3. allow multiple connections
9
 
# 4. enforce some kind of auth.
10
 
#
11
 
# Another thing is to examine the commonality and difference between
12
 
# the console app and the python evaluator in the tutorial system.
13
 
 
14
3
import socket
15
4
import cStringIO
16
5
import codeop
18
7
import cjson
19
8
import signal
20
9
 
21
 
def recv_lines(sok):
 
10
def req_lines(sok):
22
11
    buf = ''
23
12
    s = sok.recv(4096)
24
13
    while len(s) > 0:
27
16
        while i != -1:
28
17
            l = buf[0:i]
29
18
            yield l
30
 
            buf = buf[i+2:]
 
19
            buf = buf[i+1:]
31
20
            i = buf.find('\r\n')
32
21
        s = sok.recv(4096)
33
22
 
34
 
def auth_lines(lines, magic):
35
 
    for line in lines:
36
 
        digest = line[0:32]
37
 
        txt = line[32:]
38
 
        sum = md5.new(txt + magic).digest().encode('hex')
39
 
        if sum != digest:
40
 
            raise Exception, "digest failed!"
41
 
        yeild txt
42
 
 
43
 
shutup_shop_on_timeout = False
44
 
keep_going = True
45
 
 
46
23
def timeout(signum, frame):
47
 
    if shutup_shop_on_timeout:
48
 
        keep_going = False
49
 
        return
 
24
    print 'signal: ', signum
50
25
    raise Exception, 'Timeout!'
51
26
 
52
 
# signal.signal(signal.SIGALRM, timeout)
53
 
54
 
# sok = socket.socket(socket.AF_INET)
55
 
# sok.bind(('localhost',9998))
56
 
# sok.listen(1)
57
 
# (new_sok,addr) = sok.accept()
58
 
59
 
# c = codeop.CommandCompiler()
60
 
61
 
# globs = {}
62
 
# locos = {}
63
 
# globs['__builtins__'] = globals()['__builtins__']
64
 
65
 
# out = cStringIO.StringIO()
66
 
# sys.stdout = out
67
 
# first = True
68
 
# for line in req_lines(new_sok):
69
 
#     if first:
70
 
#         src = line
71
 
#         first = False
72
 
#     else:
73
 
#         src = src + '\n' + line
74
 
#     cmd = c(src)
75
 
#     if cmd is not None:
76
 
#         signal.alarm(5)
77
 
#         res = eval(cmd, globs, locos)
78
 
#         signal.alarm(0)
79
 
#         new_sok.send(cjson.encode((out.getvalue(),res)) + '\n')
80
 
#         out = cStringIO.StringIO()
81
 
#         sys.stdout = out
82
 
#         first = True
83
 
84
 
# sok.shutdown(socket.SHUT_RDWR)
85
 
 
86
 
if __name__ == "__main__":
87
 
    try:
88
 
        uid = int(sys.argv[1])
89
 
    except ValueError, v:
90
 
        print >> sys.stderr, "uid must be an integer."
91
 
        sys.exit(1)
92
 
    jail = sys.argv[2]
93
 
    cwd = sys.argv[3]
94
 
    try:
95
 
        port = int(sys.argv[4])
96
 
    except ValueError, v:
97
 
        print >> sys.stderr, "port must be an integer."
98
 
        sys.exit(1)
99
 
    magic = sys.argv[5]
100
 
    # magic = raw_input()
101
 
 
102
 
    try:
103
 
        pid = os.fork()
104
 
        if pid > 0:
105
 
            sys.exit(0)
106
 
    except OSError, e:
107
 
        print >> sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror)
108
 
        sys.exit(1)
109
 
 
110
 
    # Okay, now decouple from the parent environment
111
 
    os.chdir('/')
112
 
    os.setsid()
113
 
    os.umask(0)
114
 
 
115
 
    # do second fork
116
 
    try:
117
 
        pid = os.fork()
118
 
        if pid > 0:
119
 
            sys.exit(0)
120
 
    except OSError, e:
121
 
        print >> sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror)
122
 
        sys.exit(1)
123
 
 
124
 
    # establish the chrooted environment
125
 
    jail.setup(uid, jail, cwd)
126
 
 
127
 
    signal.signal(signal.SIGALRM, timeout)
128
 
 
129
 
    main_sok = socket.socket(socket.AF_INET)
130
 
    main_sok.bind(('localhost',port))
131
 
    main_sok.listen(1)
132
 
 
133
 
    comp = codeop.CommandCompiler()
134
 
    globs = {}
135
 
    locos = {}
136
 
    globs['__builtins__'] = globals()['__builtins__']
137
 
 
138
 
    global keep_going
139
 
    keep_going = True
140
 
    while keep_going:
141
 
        global shutup_shop_on_timeout
142
 
        shutup_shop_on_timeout = True
143
 
        signal.alarm(30 * 60) # timeout after 30 minutes
144
 
 
145
 
        (sok,addr) = main_sok.accept()
146
 
 
 
27
signal.signal(signal.SIGALRM, timeout)
 
28
 
 
29
sok = socket.socket(socket.AF_INET)
 
30
sok.bind(('localhost',9998))
 
31
sok.listen(1)
 
32
(new_sok,addr) = sok.accept()
 
33
 
 
34
c = codeop.CommandCompiler()
 
35
 
 
36
globs = {}
 
37
locos = {}
 
38
globs['__builtins__'] = globals()['__builtins__']
 
39
 
 
40
out = cStringIO.StringIO()
 
41
sys.stdout = out
 
42
first = True
 
43
for line in req_lines(new_sok):
 
44
    if first:
 
45
        src = line
 
46
        first = False
 
47
    else:
 
48
        src = src + '\n' + line
 
49
    cmd = c(src)
 
50
    if cmd is not None:
 
51
        signal.alarm(5)
 
52
        res = eval(cmd, globs, locos)
147
53
        signal.alarm(0)
148
 
        shutup_shop_on_timeout = False
149
 
 
150
 
        # FIXME do checks on addr
151
 
 
152
 
        try:
153
 
            first = True
154
 
            # for line in auth_lines(req_lines(new_sok), magic):
155
 
            for line in req_lines(new_sok):
156
 
                if first:
157
 
                    src = line
158
 
                    first = False
159
 
                else:
160
 
                    src = src + '\n' + line
161
 
                try:
162
 
                    cmd = comp(src)
163
 
                    if cmd is not None:
164
 
                        signal.alarm(5)
165
 
                        res = eval(cmd, globs, locos)
166
 
                        signal.alarm(0)
167
 
                        rval = (out.getvalue(), res, None)
168
 
                        sok.send(cjson.encode(rval) + '\n')
169
 
                        out = cStringIO.StringIO()
170
 
                        sys.stdout = out
171
 
                        first = True
172
 
                    else:
173
 
                        sok.send(cjson.encode(None) + '\n')
174
 
                except Exception, e:
175
 
                        rval = (None, None, str(e))
176
 
                        sok.send(cjson.encode(rval) + '\n')
177
 
                        out = cStringIO.StringIO()
178
 
                        sys.stdout = out
179
 
                        first = True
180
 
        finally:
181
 
            sok.close()
182
 
 
183
 
 
184
 
    main_sok.shutdown(socket.SHUT_RDWR)
 
54
        new_sok.send(cjson.encode((out.getvalue(),res)) + '\n')
 
55
        out = cStringIO.StringIO()
 
56
        sys.stdout = out
 
57
        first = True
 
58
 
 
59
sok.shutdown(socket.SHUT_RDWR)