diff options
Diffstat (limited to 'rpki/rpkidb/models.py')
-rw-r--r-- | rpki/rpkidb/models.py | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/rpki/rpkidb/models.py b/rpki/rpkidb/models.py new file mode 100644 index 00000000..a289b7ee --- /dev/null +++ b/rpki/rpkidb/models.py @@ -0,0 +1,147 @@ +""" +Django ORM models for rpkid. +""" + +from __future__ import unicode_literals +from django.db import models + +from rpki.fields import (EnumField, SundialField, BlobField, + CertificateField, KeyField, CRLField, PKCS10Field, + ManifestField, ROAField, GhostbusterField) + + +# The objects available via the left-right protocol allow NULL values +# in places we wouldn't otherwise (eg, bpki_cert fields), to support +# existing protocol which allows back-end to build up objects +# gradually. We may want to rethink this eventually, but that yak can +# wait for its shave, particularly since disallowing null should be a +# very simple change given migrations. + + +# "self" was a really bad name for this, but we weren't using Python +# when we named it. Perhaps "Tenant" would be a better name? Even +# means sort of the right thing, well, in French anyway. +# Eventually rename in left-right too, I guess. + +class Self(models.Model): + self_handle = models.SlugField(max_length = 255) + use_hsm = models.BooleanField(default = False) + crl_interval = models.BigIntegerField(null = True) + regen_margin = models.BigIntegerField(null = True) + bpki_cert = CertificateField(null = True) + bpki_glue = CertificateField(null = True) + +class BSC(models.Model): + bsc_handle = models.SlugField(max_length = 255) + private_key_id = KeyField() + pkcs10_request = PKCS10Field() + hash_alg = EnumField(choices = ("sha256",)) + signing_cert = CertificateField(null = True) + signing_cert_crl = CRLField(null = True) + self = models.ForeignKey(Self) + class Meta: + unique_together = ("self", "bsc_handle") + +class Repository(models.Model): + repository_handle = models.SlugField(max_length = 255) + peer_contact_uri = models.TextField(null = True) + bpki_cert = CertificateField(null = True) + bpki_glue = CertificateField(null = True) + last_cms_timestamp = SundialField(null = True) + bsc = models.ForeignKey(BSC) + self = models.ForeignKey(Self) + class Meta: + unique_together = ("self", "repository_handle") + +class Parent(models.Model): + parent_handle = models.SlugField(max_length = 255) + bpki_cms_cert = CertificateField(null = True) + bpki_cms_glue = CertificateField(null = True) + peer_contact_uri = models.TextField(null = True) + sia_base = models.TextField(null = True) + sender_name = models.TextField(null = True) + recipient_name = models.TextField(null = True) + last_cms_timestamp = SundialField(null = True) + self = models.ForeignKey(Self) + bsc = models.ForeignKey(BSC) + repository = models.ForeignKey(Repository) + class Meta: + unique_together = ("self", "parent_handle") + +class CA(models.Model): + last_crl_sn = models.BigIntegerField() + last_manifest_sn = models.BigIntegerField() + next_manifest_update = SundialField(null = True) + next_crl_update = SundialField(null = True) + last_issued_sn = models.BigIntegerField() + sia_uri = models.TextField(null = True) + parent_resource_class = models.TextField(null = True) + parent = models.ForeignKey(Parent) + +class CADetail(models.Model): + public_key = KeyField(null = True) + private_key_id = KeyField(null = True) + latest_crl = CRLField(null = True) + crl_published = SundialField(null = True) + latest_ca_cert = CertificateField(null = True) + manifest_private_key_id = KeyField(null = True) + manifest_public_key = KeyField(null = True) + latest_manifest_cert = CertificateField(null = True) + latest_manifest = ManifestField(null = True) + manifest_published = SundialField(null = True) + state = EnumField(choices = ("pending", "active", "deprecated", "revoked")) + ca_cert_uri = models.TextField(null = True) + ca = models.ForeignKey(CA) + +class Child(models.Model): + child_handle = models.SlugField(max_length = 255) + bpki_cert = CertificateField(null = True) + bpki_glue = CertificateField(null = True) + last_cms_timestamp = SundialField(null = True) + self = models.ForeignKey(Self) + bsc = models.ForeignKey(BSC) + class Meta: + unique_together = ("self", "child_handle") + +class ChildCert(models.Model): + cert = CertificateField() + published = SundialField(null = True) + ski = BlobField() + child = models.ForeignKey(Child) + ca_detail = models.ForeignKey(CADetail) + +class EECert(models.Model): + ski = BlobField() + cert = CertificateField() + published = SundialField(null = True) + self = models.ForeignKey(Self) + ca_detail = models.ForeignKey(CADetail) + +class Ghostbuster(models.Model): + vcard = models.TextField() + cert = CertificateField() + ghostbuster = GhostbusterField() + published = SundialField(null = True) + self = models.ForeignKey(Self) + ca_detail = models.ForeignKey(CADetail) + +class RevokedCert(models.Model): + serial = models.BigIntegerField() + revoked = SundialField() + expires = SundialField() + ca_detail = models.ForeignKey(CADetail) + +class ROA(models.Model): + asn = models.BigIntegerField() + cert = CertificateField() + roa = ROAField() + published = SundialField(null = True) + self = models.ForeignKey(Self) + ca_detail = models.ForeignKey(CADetail) + +class ROAPrefix(models.Model): + prefix = models.CharField(max_length = 40) + prefixlen = models.SmallIntegerField() + max_prefixlen = models.SmallIntegerField() + version = models.SmallIntegerField() + roa = models.ForeignKey(ROA) |