Exemple #1
0
    def __init__(self, base_url, keyfile=None):

        self._base_url = base_url

        if keyfile is None:
            self._signer = None
            return

        try:
            with open(keyfile) as fd:
                private_key_str = fd.read().strip()
        except OSError as err:
            raise XoException('Failed to read private key {}: {}'.format(
                keyfile, str(err)))

        try:
            private_key = Secp256k1PrivateKey.from_hex(private_key_str)
        except ParseError:
            try:
                private_key = Secp256k1PrivateKey.from_wif(private_key_str)
            except ParseError as e:
                raise XoException('Unable to load private key: {}'.format(
                    str(e)))

        self._signer = CryptoFactory(create_context('secp256k1')) \
            .new_signer(private_key)
Exemple #2
0
    def _send_request(
            self, suffix, data=None,
            content_type=None, name=None, auth_user=None, auth_password=None):
        if self._base_url.startswith("http://"):
            url = "{}/{}".format(self._base_url, suffix)
        else:
            url = "http://{}/{}".format(self._base_url, suffix)

        headers = {}
        if auth_user is not None:
            auth_string = "{}:{}".format(auth_user, auth_password)
            b64_string = b64encode(auth_string.encode()).decode()
            auth_header = 'Basic {}'.format(b64_string)
            headers['Authorization'] = auth_header

        if content_type is not None:
            headers['Content-Type'] = content_type

        try:
            if data is not None:
                result = requests.post(url, headers=headers, data=data)
            else:
                result = requests.get(url, headers=headers)

            if result.status_code == 404:
                raise XoException("No such game: {}".format(name))

            elif not result.ok:
                raise XoException("Error {}: {}".format(
                    result.status_code, result.reason))

        except BaseException as err:
            raise XoException(err)

        return result.text
Exemple #3
0
    def _send_request(self, suffix, data=None, content_type=None, name=None):
        if self._base_url.startswith("http://"):
            url = "{}/{}".format(self._base_url, suffix)
        else:
            url = "http://{}/{}".format(self._base_url, suffix)

        headers = {}

        if content_type is not None:
            headers['Content-Type'] = content_type

        try:
            if data is not None:
                result = requests.post(url, headers=headers, data=data)

            else:
                result = requests.get(url, headers=headers)

            if result.status_code == 404:
                raise XoException("No such item: {}".format(name))

            elif not result.ok:
                raise XoException("Error {}:{}".format(result.status_code,
                                                       result.reason))

        except requests.ConnectionError as err:
            raise XoException('Failed to connect to {}:{}'.format(
                url, str(err)))

        except BaseException as err:
            raise XoException(err)

        return result.text
Exemple #4
0
def main(prog_name=os.path.basename(sys.argv[0]), args=None):
    if args is None:
        args = sys.argv[1:]
    parser = create_parser(prog_name)
    args = parser.parse_args(args)

    if args.verbose is None:
        verbose_level = 0
    else:
        verbose_level = args.verbose

    setup_loggers(verbose_level=verbose_level)

    if args.command == 'create':
        do_create(args)
    elif args.command == 'list':
        do_list(args)
    elif args.command == 'show':
        do_show(args)
    elif args.command == 'take':
        do_take(args)
    elif args.command == 'delete':
        do_delete(args)
    else:
        raise XoException("invalid command: {}".format(args.command))
Exemple #5
0
def main(prog_name=os.path.basename(sys.argv[0]), args=sys.argv[1:]):
    parser = create_parser(prog_name)
    args = parser.parse_args(args)

    if args.verbose is None:
        verbose_level = 0
    else:
        verbose_level = args.verbose

    setup_loggers(verbose_level=verbose_level)

    config = load_config()

    if args.command == 'create':
        do_create(args, config)
    elif args.command == 'init':
        do_init(args, config)
    elif args.command == 'reset':
        do_reset(args, config)
    elif args.command == 'list':
        do_list(args, config)
    elif args.command == 'show':
        do_show(args, config)
    elif args.command == 'take':
        do_take(args, config)
    else:
        raise XoException("invalid command: {}".format(args.command))
Exemple #6
0
def do_show(args, config):
    name = args.name

    url = config.get('DEFAULT', 'url')
    key_file = config.get('DEFAULT', 'key_file')

    client = XoClient(base_url=url, keyfile=key_file)
    game = client.show(name).decode()

    if game is not None:

        board_str, game_state, player1, player2, name = \
            game.split(",")

        board = list(board_str.replace("-", " "))

        print("GAME:     : {}".format(name))
        print("PLAYER 1  : {}".format(player1[:6]))
        print("PLAYER 2  : {}".format(player2[:6]))
        print("STATE     : {}".format(game_state))
        print("")
        print("  {} | {} | {}".format(board[0], board[1], board[2]))
        print(" ---|---|---")
        print("  {} | {} | {}".format(board[3], board[4], board[5]))
        print(" ---|---|---")
        print("  {} | {} | {}".format(board[6], board[7], board[8]))
        print("")

    else:
        raise XoException("Game not found: {}".format(name))
Exemple #7
0
    def __init__(self, base_url, keyfile):

        self._base_url = base_url

        try:
            with open(keyfile) as fd:
                self._private_key = fd.read().strip()
                fd.close()
        except FileNotFoundError:
            raise XoException(
                'Could not find private key file {}; '
                'try running `sawtooth keygen`'.format(keyfile))
        except OSError:
            raise XoException("Failed to read keys.")

        self._public_key = signing.generate_pubkey(self._private_key)
Exemple #8
0
 def _get_status(self, batch_id, wait):
     try:
         result = self._send_request('batch_statuses?id={}&wait={}'.format(
             batch_id, wait))
         return yaml.safe_load(result)['data'][0]['status']
     except BaseException as err:
         raise XoException(err)
Exemple #9
0
def do_show(args):
    name = args.name

    url = _get_url(args)
    keyfile = _get_keyfile(args)
    auth_user, auth_password = _get_auth_info(args)

    client = XoClient(base_url=url, keyfile=keyfile)

    data = client.show(name, auth_user=auth_user, auth_password=auth_password)

    if data is not None:

        board_str, game_state, player1, player2 = {
            name: (board, state, player_1, player_2)
            for name, board, state, player_1, player_2 in
            [game.split(',') for game in data.decode().split('|')]
        }[name]

        board = list(board_str.replace("-", " "))

        print("GAME:     : {}".format(name))
        print("PLAYER 1  : {}".format(player1[:6]))
        print("PLAYER 2  : {}".format(player2[:6]))
        print("STATE     : {}".format(game_state))
        print("")
        print("  {} | {} | {}".format(board[0], board[1], board[2]))
        print(" ---|---|---")
        print("  {} | {} | {}".format(board[3], board[4], board[5]))
        print(" ---|---|---")
        print("  {} | {} | {}".format(board[6], board[7], board[8]))
        print("")

    else:
        raise XoException("Game not found: {}".format(name))
Exemple #10
0
def do_show(args, config):
    name = args.name

    url = config.get('DEFAULT', 'url')
    key_file = config.get('DEFAULT', 'key_file')

    client = XoClient(base_url=url, keyfile=key_file)
    state = client.get_state()

    if name not in state:
        raise XoException('no such game: {}'.format(name))

    game = state[name]

    player1 = ''
    player2 = ''
    if 'Player1' in game:
        player1 = game['Player1']
    if 'Player2' in game:
        player2 = game['Player2']
    board = list(game['Board'].replace('-', ' '))
    game_state = game['State']

    print "GAME:     : {}".format(name)
    print "PLAYER 1  : {}".format(player1)
    print "PLAYER 2  : {}".format(player2)
    print "STATE     : {}".format(game_state)
    print ""
    print "  {} | {} | {}".format(board[0], board[1], board[2])
    print " ---|---|---"
    print "  {} | {} | {}".format(board[3], board[4], board[5])
    print " ---|---|---"
    print "  {} | {} | {}".format(board[6], board[7], board[8])
    print ""
 def _get_status(self, batch_id, wait, auth_user=None, auth_password=None):
     try:
         result = self._send_request('batch_status?id={}&wait={}'.format(
             batch_id, wait),
                                     auth_user=auth_user,
                                     auth_password=auth_password)
         return yaml.safe_load(result)['data'][0]['status']
     except BaseException as err:
         raise XoException(err)
Exemple #12
0
    def _send_request(self, suffix, data=None, content_type=None):
        url = "http://{}/{}".format(self._base_url, suffix)

        headers = None
        if content_type is not None:
            headers = {'Content-Type': content_type}

        try:
            if data is not None:
                result = requests.post(url, headers=headers, data=data)
            else:
                result = requests.get(url)

            if not result.ok:
                raise XoException("Error {}: {}".format(
                    result.status_code, result.reason))

        except BaseException as err:
            raise XoException(err)

        return result.text
Exemple #13
0
    def _send_request(self, suffix, content=None, content_type=None):
        url = "http://{}/{}".format(self._base_url, suffix)
        if content_type is not None:
            content_type = {'Content-Type': content_type}

        if content is None or content_type is None:
            request = urllib.request.Request(url)
        else:
            request = urllib.request.Request(url, content, content_type)
        try:
            result = urllib.request.urlopen(request).read().decode()
        except BaseException as err:
            raise XoException(err)
        return result
    def __init__(self, base_url, keyfile=None):

        self._base_url = base_url

        if keyfile is None:
            self._private_key = None
            self._public_key = None
            return

        try:
            with open(keyfile) as fd:
                self._private_key = fd.read().strip()
                fd.close()
        except OSError as err:
            raise XoException('Failed to read private key {}: {}'.format(
                keyfile, str(err)))

        self._public_key = signing.generate_public_key(self._private_key)
Exemple #15
0
def do_list(args, config):
    url = config.get('DEFAULT', 'url')
    key_file = config.get('DEFAULT', 'key_file')

    client = XoClient(base_url=url, keyfile=key_file)
    game_list = client.list()

    if game_list is not None:
        fmt = "%-15s %-15.15s %-15.15s %-9s %s"
        print(fmt % ('GAME', 'PLAYER 1', 'PLAYER 2', 'BOARD', 'STATE'))
        for game_data in game_list:

            board, game_state, player1, player2, name = \
                game_data.decode().split(",")

            print(fmt % (name, player1[:6], player2[:6], board, game_state))
    else:
        raise XoException("Could not retrieve game listing.")
Exemple #16
0
def do_init(args, config):
    username = config.get('DEFAULT', 'username')
    if args.username is not None:
        username = args.username

    url = config.get('DEFAULT', 'url')
    if args.url is not None:
        url = args.url

    config.set('DEFAULT', 'username', username)
    print("set username: {}".format(username))
    config.set('DEFAULT', 'url', url)
    print("set url: {}".format(url))

    save_config(config)

    wif_filename = config.get('DEFAULT', 'key_file')
    if wif_filename.endswith(".wif"):
        addr_filename = wif_filename[0:-len(".wif")] + ".addr"
    else:
        addr_filename = wif_filename + ".addr"

    if not os.path.exists(wif_filename):
        try:
            if not os.path.exists(os.path.dirname(wif_filename)):
                os.makedirs(os.path.dirname(wif_filename))

            privkey = signing.generate_privkey()
            encoded = signing.encode_privkey(privkey, 'wif')
            pubkey = signing.generate_pubkey(privkey)
            addr = signing.generate_identifier(pubkey)

            with open(wif_filename, "w") as wif_fd:
                print("writing file: {}".format(wif_filename))
                wif_fd.write(encoded)
                wif_fd.write("\n")

            with open(addr_filename, "w") as addr_fd:
                print("writing file: {}".format(addr_filename))
                addr_fd.write(addr)
                addr_fd.write("\n")
        except IOError as ioe:
            raise XoException("IOError: {}".format(str(ioe)))
Exemple #17
0
def do_list(args):
    url = _get_url(args)
    auth_user, auth_password = _get_auth_info(args)

    client = XoClient(base_url=url, keyfile=None)

    game_list = [
        game.split(',') for games in client.list(auth_user=auth_user,
                                                 auth_password=auth_password)
        for game in games.decode().split('|')
    ]

    if game_list is not None:
        fmt = "%-15s %-15.15s %-15.15s %-9s %s"
        print(fmt % ('GAME', 'PLAYER 1', 'PLAYER 2', 'BOARD', 'STATE'))
        for game_data in game_list:

            name, board, game_state, player1, player2 = game_data

            print(fmt % (name, player1[:6], player2[:6], board, game_state))
    else:
        raise XoException("Could not retrieve game listing.")
Exemple #18
0
def do_init(args, config):
    username = config.get('DEFAULT', 'username')
    if args.username is not None:
        username = args.username

    config.set('DEFAULT', 'username', username)
    print "set username: {}".format(username)

    save_config(config)

    wif_filename = config.get('DEFAULT', 'key_file')
    if wif_filename.endswith(".wif"):
        addr_filename = wif_filename[0:-len(".wif")] + ".addr"
    else:
        addr_filename = wif_filename + ".addr"

    if not os.path.exists(wif_filename):
        try:
            if not os.path.exists(os.path.dirname(wif_filename)):
                os.makedirs(os.path.dirname(wif_filename))

            privkey = pybitcointools.random_key()
            encoded = pybitcointools.encode_privkey(privkey, 'wif')
            addr = pybitcointools.privtoaddr(privkey)

            with open(wif_filename, "w") as wif_fd:
                print "writing file: {}".format(wif_filename)
                wif_fd.write(encoded)
                wif_fd.write("\n")

            with open(addr_filename, "w") as addr_fd:
                print "writing file: {}".format(addr_filename)
                addr_fd.write(addr)
                addr_fd.write("\n")
        except IOError, ioe:
            raise XoException("IOError: {}".format(str(ioe)))
Exemple #19
0
 def _get_merkle_root(self):
     result = self._send_request("state")
     try:
         return yaml.load(result)['merkleRoot']
     except BaseException:
         raise XoException("Could not retrieve merkle root.")
Exemple #20
0
    def check_valid(self, store):
        """Determines if the transaction is valid.

        Args:
            store (dict): Transaction store mapping.
        """

        if not super(XoTransaction, self).is_valid(store):
            raise XoException("invalid transaction")

        LOGGER.debug('checking %s', str(self))

        if self._name is None or self._name == '':
            raise XoException('name not set')

        if self._action is None or self._action == '':
            raise XoException('action not set')

        if self._action == 'CREATE':
            if self._name in store:
                raise XoException('game already exists')
        elif self._action == 'TAKE':
            if self._space is None:
                raise XoException('TAKE requires space')

            if self._space < 1 or self._space > 9:
                raise XoException('invalid space')

            if self._name not in store:
                raise XoException('no such game')

            state = store[self._name]['State']
            if state in ['P1-WIN', 'P2-WIN', 'TIE']:
                raise XoException('game complete')

            if state == 'P1-NEXT' and 'Player1' in store[self._name]:
                player1 = store[self._name]['Player1']
                if player1 != self.OriginatorID:
                    raise XoException('invalid player 1')

            if state == 'P2-NEXT' and 'Player2' in store[self._name]:
                player1 = store[self._name]['Player2']
                if player1 != self.OriginatorID:
                    raise XoException('invalid player 2')

            if store[self._name]['Board'][self._space - 1] != '-':
                raise XoException('space already taken')
        else:
            raise XoException('invalid action')