ungleich-game/challenges.py

84 lines
2.2 KiB
Python

import challenge
import ipaddress
from flask import request
class RegisterNet(challenge.Challenge):
points = 10
provides = [ "network" ]
description = """
Register a /64 IPv6 network that you fully control.
Many other challenges depend on this. You will need to
be able to configure IPv6 addresses in this networks
and to setup services listening on these IPv6 addresses.
Submit your network with the "network" parameter.
"""
def solve(self):
args = self.get_args("user", "network")
network = args['network']
user = args['user']
try:
net = ipaddress.IPv6Network(network)
except Exception as e:
return self.error("Cannot register network {}: {}".format(network, e))
if not net.prefixlen == 64:
return self.error("{} mask is not /64 - please use a /64 network".format(net))
# Save network
self.db.set_user_key(user, "network", network)
self.save_points(user)
return "Network {} registered, that's a good start!\n".format(network)
class IPv6Address(challenge.Challenge):
points = 20
requires = [ "network" ]
description = """
You have setup your network, great!
Now it is time to show that you are really controlling your network!
Setup the IPv6 address
{}
and POST to this address, when it should be reachable by ping6.
"""
def describe(self):
args = self.require_args("user")
user = args['user']
key = "network"
network = self.db.get_user_key_or_none(user, key)
if not network:
return Response(status=400, response="""
Register a network before trying to be reachable. Possible challenges that
provide the network are:
{}
""".format("\n".join(self.dependencies_provided_by['network'])))
key = "address"
address = self.db.get_user_key_or_none(user, key)
if not address:
address = get_random_ip(network.value)
self.db.set_user_key(user, key, address)
else:
address = address.value
return self.description.format(address)
def solve(self):
args = require_args("user")
user = args['user']
return Response(status=400, response="""
Not yet implemented""")