133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Copyright 2012 the V8 project authors. All rights reserved. 233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Redistribution and use in source and binary forms, with or without 333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# modification, are permitted provided that the following conditions are 433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# met: 533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# 633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Redistributions of source code must retain the above copyright 733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# notice, this list of conditions and the following disclaimer. 833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Redistributions in binary form must reproduce the above 933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# copyright notice, this list of conditions and the following 1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# disclaimer in the documentation and/or other materials provided 1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# with the distribution. 1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Neither the name of Google Inc. nor the names of its 1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# contributors may be used to endorse or promote products derived 1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# from this software without specific prior written permission. 1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# 1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport socket 3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport SocketServer 3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom . import compression 3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom . import constants 3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef _StatusQuery(peer, query): 3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org code = sock.connect_ex((peer.address, constants.STATUS_PORT)) 3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if code != 0: 4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org # TODO(jkummerow): disconnect (after 3 failures?) 4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return 4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org compression.Send(query, sock) 4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org compression.Send(constants.END_OF_STREAM, sock) 4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org rec = compression.Receiver(sock) 4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org data = None 4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org while not rec.IsDone(): 4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org data = rec.Current() 4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assert data[0] == query[0] 4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org data = data[1] 5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org rec.Advance() 5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org sock.close() 5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return data 5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef RequestTrustedPubkeys(peer, server): 5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org pubkey_list = _StatusQuery(peer, [constants.LIST_TRUSTED_PUBKEYS]) 5733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for pubkey in pubkey_list: 5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if server.IsTrusted(pubkey): continue 5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org result = _StatusQuery(peer, [constants.GET_SIGNED_PUBKEY, pubkey]) 6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org server.AcceptNewTrusted(result) 6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef NotifyNewTrusted(peer, data): 6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org _StatusQuery(peer, [constants.NOTIFY_NEW_TRUSTED] + data) 6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef ITrustYouNow(peer): 6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org _StatusQuery(peer, [constants.TRUST_YOU_NOW]) 6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef TryTransitiveTrust(peer, pubkey, server): 7233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if _StatusQuery(peer, [constants.DO_YOU_TRUST, pubkey]): 7333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org result = _StatusQuery(peer, [constants.GET_SIGNED_PUBKEY, pubkey]) 7433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org server.AcceptNewTrusted(result) 7533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass StatusHandler(SocketServer.BaseRequestHandler): 7833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def handle(self): 7933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org rec = compression.Receiver(self.request) 8033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org while not rec.IsDone(): 8133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org data = rec.Current() 8233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org action = data[0] 8333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 8433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if action == constants.LIST_TRUSTED_PUBKEYS: 8533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org response = self.server.daemon.ListTrusted() 8633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org compression.Send([action, response], self.request) 8733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 8833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org elif action == constants.GET_SIGNED_PUBKEY: 8933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org response = self.server.daemon.SignTrusted(data[1]) 9033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org compression.Send([action, response], self.request) 9133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 9233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org elif action == constants.NOTIFY_NEW_TRUSTED: 9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.server.daemon.AcceptNewTrusted(data[1:]) 9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org pass # No response. 9533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 9633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org elif action == constants.TRUST_YOU_NOW: 9733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.server.daemon.MarkPeerAsTrusting(self.client_address[0]) 9833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org pass # No response. 9933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 10033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org elif action == constants.DO_YOU_TRUST: 10133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org response = self.server.daemon.IsTrusted(data[1]) 10233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org compression.Send([action, response], self.request) 10333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 10433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org rec.Advance() 10533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org compression.Send(constants.END_OF_STREAM, self.request) 10633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 10733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 10833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass StatusSocketServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): 10933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def __init__(self, daemon): 11033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org address = (daemon.ip, constants.STATUS_PORT) 11133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org SocketServer.TCPServer.__init__(self, address, StatusHandler) 11233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.daemon = daemon 113