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

« back to all changes in this revision

Viewing changes to ivle/chat.py

  • Committer: William Grant
  • Date: 2010-02-24 07:22:43 UTC
  • Revision ID: grantw@unimelb.edu.au-20100224072243-xq5w2we8iuoteen1
Reword and reformat the tour a bit.

Show diffs side-by-side

added added

removed removed

Lines of Context:
89
89
        (conn, addr) = s.accept()
90
90
        conn.settimeout(SOCKETTIMEOUT)
91
91
        try:
92
 
            # Grab the input and try to decode
 
92
            # Grab the input
93
93
            inp = recv_netstring(conn)
94
 
            try:
95
 
                content = decode(inp, magic)
96
 
            except ProtocolError:
 
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:
97
99
                conn.close()
98
100
                continue
99
101
 
 
102
            content = cjson.decode(env['content'])
 
103
 
100
104
            response = handler(content)
101
105
 
102
106
            send_netstring(conn, cjson.encode(response))
127
131
    sok = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
128
132
    sok.connect((host, port))
129
133
    sok.settimeout(SOCKETTIMEOUT)
130
 
 
131
 
    json = encode(msg, magic)
 
134
    content = cjson.encode(msg)
 
135
    digest = hashlib.md5(content + magic).hexdigest()
 
136
    env = {'digest':digest,'content':content}
 
137
    json = cjson.encode(env)
132
138
 
133
139
    send_netstring(sok, json)
134
140
    inp = recv_netstring(sok)
140
146
    else:
141
147
        return inp
142
148
 
143
 
def encode(message, magic):
144
 
    """Converts a message into a JSON serialisation and uses a magic
145
 
    string to attach a HMAC digest.
146
 
    """
147
 
    # XXX: Any reason that we double encode?
148
 
    content = cjson.encode(message)
149
 
 
150
 
    digest = hashlib.md5(content + magic).hexdigest()
151
 
    env = {'digest':digest,'content':content}
152
 
    json = cjson.encode(env)
153
 
 
154
 
    return json
155
 
 
156
 
 
157
 
def decode(message, magic):
158
 
    """Takes a message with an attached HMAC digest and validates the message.
159
 
    """
160
 
    msg = cjson.decode(message)
161
 
 
162
 
    # Check that the message is valid
163
 
    digest = hashlib.md5(msg['content'] + magic).hexdigest()
164
 
    if msg['digest'] != digest:
165
 
        raise ProtocolError("HMAC digest is invalid")
166
 
    content = cjson.decode(msg['content'])
167
 
 
168
 
    return content
169
 
 
170
149
 
171
150
def send_netstring(sok, data):
172
 
    """ Sends a netstring to a socket
173
 
    """
174
151
    netstring = "%d:%s,"%(len(data),data)
175
152
    sok.sendall(netstring)
176
153
 
177
154
 
178
155
def recv_netstring(sok):
179
 
    """ Attempts to recieve a Netstring from a socket.
180
 
    Throws a ProtocolError if the received data violates the Netstring 
181
 
    protocol.
182
 
    """
183
156
    # Decode netstring
184
157
    size_buffer = []
185
158
    c = sok.recv(1)