84 lines
2.2 KiB
Python
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""")
|