aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki/irdb/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'rpkid/rpki/irdb/models.py')
-rw-r--r--rpkid/rpki/irdb/models.py45
1 files changed, 33 insertions, 12 deletions
diff --git a/rpkid/rpki/irdb/models.py b/rpkid/rpki/irdb/models.py
index 2cc3f5aa..fad3b31a 100644
--- a/rpkid/rpki/irdb/models.py
+++ b/rpkid/rpki/irdb/models.py
@@ -27,13 +27,22 @@ import rpki.x509
import rpki.sundial
import socket
+## @var ip_version_choices
+# Choice argument for fields implementing IP version numbers.
+
+ip_version_choices = ((4, "IPv4"), (6, "IPv6"))
+
###
+# Field types
+
class HandleField(django.db.models.CharField):
"""
A handle field type.
"""
+ description = 'A "handle" in one of the RPKI protocols'
+
def __init__(self, *args, **kwargs):
kwargs["max_length"] = 120
django.db.models.CharField.__init__(self, *args, **kwargs)
@@ -44,6 +53,8 @@ class EnumField(django.db.models.PositiveSmallIntegerField):
in SQL.
"""
+ description = "An enumeration type"
+
__metaclass__ = django.db.models.SubfieldBase
def __init__(self, *args, **kwargs):
@@ -64,6 +75,8 @@ class SundialField(django.db.models.DateTimeField):
A field type for our customized datetime objects.
"""
+ description = "A datetime type using our customized datetime objects"
+
def to_python(self, value):
return rpki.sundial.datetime.fromdatetime(
django.db.models.DateTimeField.to_python(self, value))
@@ -76,7 +89,7 @@ class SundialField(django.db.models.DateTimeField):
class DERField(django.db.models.Field):
"""
- A field type for DER objects.
+ A field type to represent ASN.1 DER objects as SQL BLOBs.
This is an abstract class, subclasses need to define rpki_type.
"""
@@ -131,10 +144,9 @@ class SignedReferralField(DERField):
description = "CMS signed object containing XML"
rpki_type = rpki.x509.SignedReferral
-## @var ip_version_choices
-# Choice argument for fields implementing IP version numbers.
+###
-ip_version_choices = ((4, "IPv4"), (6, "IPv6"))
+# Custom managers
class CertificateManager(django.db.models.Manager):
@@ -183,7 +195,7 @@ class ServerCAManager(CertificateManager):
def _get_or_certify_keys(self, kwargs):
return { "pk" : 1 }
-class ReferralCertificateManager(CertificateManager):
+class ResourceHolderEEManager(CertificateManager):
def _get_or_certify_keys(self, kwargs):
return { "issuer" : kwargs["issuer"] }
@@ -366,9 +378,9 @@ class EECertificate(Certificate):
validity_interval = self.default_interval,
is_ca = False)
-class ServerCertificate(EECertificate):
+class ServerEE(EECertificate):
issuer = django.db.models.ForeignKey(ServerCA, related_name = "ee_certificates")
- purpose = EnumField(choices = ("rpkid", "pubd", "irdbd", "irbe", "rootd"))
+ purpose = EnumField(choices = ("rpkid", "pubd", "irdbd", "irbe"))
class Meta:
unique_together = ("issuer", "purpose")
@@ -377,14 +389,24 @@ class ServerCertificate(EECertificate):
def subject_name(self):
return rpki.x509.X501DN("%s BPKI %s EE" % (socket.gethostname(), self.get_purpose_display()))
-class ReferralCertificate(EECertificate):
+class Referral(EECertificate):
issuer = django.db.models.OneToOneField(ResourceHolderCA, related_name = "referral_certificate")
- objects = ReferralCertificateManager()
+ objects = ResourceHolderEEManager()
@property
def subject_name(self):
return rpki.x509.X501DN("%s BPKI Referral EE" % self.issuer.handle)
+class Turtle(django.db.models.Model):
+ service_uri = django.db.models.CharField(max_length = 255)
+
+class Rootd(EECertificate, Turtle):
+ issuer = django.db.models.OneToOneField(ResourceHolderCA, related_name = "rootd")
+ objects = ResourceHolderEEManager()
+
+ @property
+ def subject_name(self):
+ return rpki.x509.X501DN("%s BPKI rootd EE" % self.issuer.handle)
class BSC(Certificate):
issuer = django.db.models.ForeignKey(ResourceHolderCA, related_name = "bscs")
@@ -423,11 +445,10 @@ class ChildNet(django.db.models.Model):
class Meta:
unique_together = ("child", "start_ip", "end_ip", "version")
-class Parent(CrossCertification):
+class Parent(CrossCertification, Turtle):
issuer = django.db.models.ForeignKey(ResourceHolderCA, related_name = "parents")
parent_handle = HandleField()
child_handle = HandleField()
- service_uri = django.db.models.CharField(max_length = 255)
repository_type = EnumField(choices = ("none", "offer", "referral"))
referrer = HandleField(null = True, blank = True)
referral_authorization = SignedReferralField(null = True, blank = True)
@@ -456,7 +477,7 @@ class Repository(CrossCertification):
client_handle = HandleField()
service_uri = django.db.models.CharField(max_length = 255)
sia_base = django.db.models.TextField()
- parent = django.db.models.OneToOneField(Parent, related_name = "repository")
+ turtle = django.db.models.OneToOneField(Turtle, related_name = "repository")
class Client(CrossCertification):
issuer = django.db.models.ForeignKey(ServerCA, related_name = "clients")