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

« back to all changes in this revision

Viewing changes to ivle/chat.py

  • Committer: William Grant
  • Date: 2012-06-28 01:52:02 UTC
  • Revision ID: me@williamgrant.id.au-20120628015202-f6ru7o367gt6nvgz
Hah

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
# Author: Thomas Conway
20
20
# Date:   5/2/2008
21
21
 
22
 
import cjson
 
22
try:
 
23
    import json
 
24
except ImportError:
 
25
    import simplejson as json
 
26
 
23
27
import cStringIO
24
28
import hashlib
25
29
import sys
89
93
        (conn, addr) = s.accept()
90
94
        conn.settimeout(SOCKETTIMEOUT)
91
95
        try:
92
 
            # Grab the input
 
96
            # Grab the input and try to decode
93
97
            inp = recv_netstring(conn)
94
 
            env = cjson.decode(inp)
95
 
 
96
 
            # Check that the message is 
97
 
            digest = hashlib.md5(env['content'] + magic).hexdigest()
98
 
            if env['digest'] != digest:
 
98
            try:
 
99
                content = decode(inp, magic)
 
100
            except ProtocolError:
99
101
                conn.close()
100
102
                continue
101
103
 
102
 
            content = cjson.decode(env['content'])
103
 
 
104
104
            response = handler(content)
105
105
 
106
 
            send_netstring(conn, cjson.encode(response))
 
106
            send_netstring(conn, json.dumps(response))
107
107
 
108
108
            conn.close()
109
109
 
110
110
        except Terminate, t:
111
111
            # Try and send final response and then terminate
112
112
            if t.final_response:
113
 
                send_netstring(conn, cjson.encode(t.final_response))
 
113
                send_netstring(conn, json.dumps(t.final_response))
114
114
            conn.close()
115
115
            sys.exit(0)
116
116
        except Exception:
123
123
                "value": str(e_val),
124
124
                "traceback": tb_dump.getvalue()
125
125
            }
126
 
            send_netstring(conn, cjson.encode(json_exc))
 
126
            send_netstring(conn, json.dumps(json_exc))
127
127
            conn.close()
128
128
 
129
129
 
131
131
    sok = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
132
132
    sok.connect((host, port))
133
133
    sok.settimeout(SOCKETTIMEOUT)
134
 
    content = cjson.encode(msg)
135
 
    digest = hashlib.md5(content + magic).hexdigest()
136
 
    env = {'digest':digest,'content':content}
137
 
    json = cjson.encode(env)
138
 
 
139
 
    send_netstring(sok, json)
 
134
 
 
135
    out = encode(msg, magic)
 
136
 
 
137
    send_netstring(sok, out)
140
138
    inp = recv_netstring(sok)
141
139
 
142
140
    sok.close()
143
141
 
144
142
    if decode:
145
 
        return cjson.decode(inp)
 
143
        return json.loads(inp)
146
144
    else:
147
145
        return inp
148
146
 
 
147
def encode(message, magic):
 
148
    """Converts a message into a JSON serialisation and uses a magic
 
149
    string to attach a HMAC digest.
 
150
    """
 
151
    # XXX: Any reason that we double encode?
 
152
    content = json.dumps(message)
 
153
 
 
154
    digest = hashlib.md5(content + magic).hexdigest()
 
155
    env = {'digest':digest,'content':content}
 
156
    return json.dumps(env)
 
157
 
 
158
 
 
159
def decode(message, magic):
 
160
    """Takes a message with an attached HMAC digest and validates the message.
 
161
    """
 
162
    msg = json.loads(message)
 
163
 
 
164
    # Check that the message is valid
 
165
    digest = hashlib.md5(msg['content'] + magic).hexdigest()
 
166
    if msg['digest'] != digest:
 
167
        raise ProtocolError("HMAC digest is invalid")
 
168
    content = json.loads(msg['content'])
 
169
 
 
170
    return content
 
171
 
149
172
 
150
173
def send_netstring(sok, data):
 
174
    """ Sends a netstring to a socket
 
175
    """
151
176
    netstring = "%d:%s,"%(len(data),data)
152
177
    sok.sendall(netstring)
153
178
 
154
179
 
155
180
def recv_netstring(sok):
 
181
    """ Attempts to recieve a Netstring from a socket.
 
182
    Throws a ProtocolError if the received data violates the Netstring 
 
183
    protocol.
 
184
    """
156
185
    # Decode netstring
157
186
    size_buffer = []
158
187
    c = sok.recv(1)