aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpki/fields.py4
-rw-r--r--rpki/rpkid.py12
-rw-r--r--rpki/rpkidb/migrations/0001_initial.py233
-rw-r--r--rpki/rpkidb/migrations/__init__.py0
-rw-r--r--rpki/rpkidb/models.py147
5 files changed, 391 insertions, 5 deletions
diff --git a/rpki/fields.py b/rpki/fields.py
index dab6ce14..d1025c35 100644
--- a/rpki/fields.py
+++ b/rpki/fields.py
@@ -99,6 +99,10 @@ class BlobField(models.Field):
guidelines than actual rules. But "BLOB" works.
For anything else, we just use "BLOB" and hope for the best.
+
+ NB: This field type predates Django 1.6's BinaryField. Probably
+ this should be retired in favor of BinaryField, but I'd have to
+ figure out what that does to field types that derive from this one.
"""
__metaclass__ = models.SubfieldBase
diff --git a/rpki/rpkid.py b/rpki/rpkid.py
index 478c46bd..4e376a68 100644
--- a/rpki/rpkid.py
+++ b/rpki/rpkid.py
@@ -284,12 +284,14 @@ class main(object):
if match is None:
raise rpki.exceptions.BadContactURL("Bad URL path received in up_down_handler(): %s" % path)
self_handle, child_handle = match.groups()
- child = rpki.left_right.child_elt.sql_fetch_where1(self,
- "self.self_handle = %s AND child.child_handle = %s AND child.self_id = self.self_id",
- (self_handle, child_handle),
- "self")
+ child = rpki.left_right.child_elt.sql_fetch_where1(
+ gctx = self,
+ where = "self.self_handle = %s AND child.child_handle = %s AND child.self_id = self.self_id",
+ args = (self_handle, child_handle),
+ also_from = "self")
if child is None:
- raise rpki.exceptions.ChildNotFound("Could not find child %s of self %s in up_down_handler()" % (child_handle, self_handle))
+ raise rpki.exceptions.ChildNotFound("Could not find child %s of self %s in up_down_handler()" % (
+ child_handle, self_handle))
child.serve_up_down(q_der, done)
except (rpki.async.ExitNow, SystemExit):
raise
diff --git a/rpki/rpkidb/migrations/0001_initial.py b/rpki/rpkidb/migrations/0001_initial.py
new file mode 100644
index 00000000..77c9012f
--- /dev/null
+++ b/rpki/rpkidb/migrations/0001_initial.py
@@ -0,0 +1,233 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import rpki.fields
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='BSC',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('bsc_handle', models.SlugField(max_length=255)),
+ ('private_key_id', rpki.fields.KeyField(default=None, serialize=False, blank=True)),
+ ('pkcs10_request', rpki.fields.PKCS10Field(default=None, serialize=False, blank=True)),
+ ('hash_alg', rpki.fields.EnumField(choices=[(1, 'sha256')])),
+ ('signing_cert', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ('signing_cert_crl', rpki.fields.CRLField(default=None, serialize=False, null=True, blank=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='CA',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('last_crl_sn', models.BigIntegerField()),
+ ('last_manifest_sn', models.BigIntegerField()),
+ ('next_manifest_update', rpki.fields.SundialField(null=True)),
+ ('next_crl_update', rpki.fields.SundialField(null=True)),
+ ('last_issued_sn', models.BigIntegerField()),
+ ('sia_uri', models.TextField(null=True)),
+ ('parent_resource_class', models.TextField(null=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='CADetail',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('public_key', rpki.fields.KeyField(default=None, serialize=False, null=True, blank=True)),
+ ('private_key_id', rpki.fields.KeyField(default=None, serialize=False, null=True, blank=True)),
+ ('latest_crl', rpki.fields.CRLField(default=None, serialize=False, null=True, blank=True)),
+ ('crl_published', rpki.fields.SundialField(null=True)),
+ ('latest_ca_cert', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ('manifest_private_key_id', rpki.fields.KeyField(default=None, serialize=False, null=True, blank=True)),
+ ('manifest_public_key', rpki.fields.KeyField(default=None, serialize=False, null=True, blank=True)),
+ ('latest_manifest_cert', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ('latest_manifest', rpki.fields.ManifestField(default=None, serialize=False, null=True, blank=True)),
+ ('manifest_published', rpki.fields.SundialField(null=True)),
+ ('state', rpki.fields.EnumField(choices=[(1, 'pending'), (2, 'active'), (3, 'deprecated'), (4, 'revoked')])),
+ ('ca_cert_uri', models.TextField(null=True)),
+ ('ca', models.ForeignKey(to='rpkidb.CA')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Child',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('child_handle', models.SlugField(max_length=255)),
+ ('bpki_cert', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ('bpki_glue', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ('last_cms_timestamp', rpki.fields.SundialField(null=True)),
+ ('bsc', models.ForeignKey(to='rpkidb.BSC')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='ChildCert',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('cert', rpki.fields.CertificateField(default=None, serialize=False, blank=True)),
+ ('published', rpki.fields.SundialField(null=True)),
+ ('ski', rpki.fields.BlobField(default=None, serialize=False, blank=True)),
+ ('ca_detail', models.ForeignKey(to='rpkidb.CADetail')),
+ ('child', models.ForeignKey(to='rpkidb.Child')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='EECert',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('ski', rpki.fields.BlobField(default=None, serialize=False, blank=True)),
+ ('cert', rpki.fields.CertificateField(default=None, serialize=False, blank=True)),
+ ('published', rpki.fields.SundialField(null=True)),
+ ('ca_detail', models.ForeignKey(to='rpkidb.CADetail')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Ghostbuster',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('vcard', models.TextField()),
+ ('cert', rpki.fields.CertificateField(default=None, serialize=False, blank=True)),
+ ('ghostbuster', rpki.fields.GhostbusterField(default=None, serialize=False, blank=True)),
+ ('published', rpki.fields.SundialField(null=True)),
+ ('ca_detail', models.ForeignKey(to='rpkidb.CADetail')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Parent',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('parent_handle', models.SlugField(max_length=255)),
+ ('bpki_cms_cert', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ('bpki_cms_glue', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=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', rpki.fields.SundialField(null=True)),
+ ('bsc', models.ForeignKey(to='rpkidb.BSC')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Repository',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('repository_handle', models.SlugField(max_length=255)),
+ ('peer_contact_uri', models.TextField(null=True)),
+ ('bpki_cert', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ('bpki_glue', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ('last_cms_timestamp', rpki.fields.SundialField(null=True)),
+ ('bsc', models.ForeignKey(to='rpkidb.BSC')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='RevokedCert',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('serial', models.BigIntegerField()),
+ ('revoked', rpki.fields.SundialField()),
+ ('expires', rpki.fields.SundialField()),
+ ('ca_detail', models.ForeignKey(to='rpkidb.CADetail')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='ROA',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('asn', models.BigIntegerField()),
+ ('cert', rpki.fields.CertificateField(default=None, serialize=False, blank=True)),
+ ('roa', rpki.fields.ROAField(default=None, serialize=False, blank=True)),
+ ('published', rpki.fields.SundialField(null=True)),
+ ('ca_detail', models.ForeignKey(to='rpkidb.CADetail')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='ROAPrefix',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('prefix', models.CharField(max_length=40)),
+ ('prefixlen', models.SmallIntegerField()),
+ ('max_prefixlen', models.SmallIntegerField()),
+ ('version', models.SmallIntegerField()),
+ ('roa', models.ForeignKey(to='rpkidb.ROA')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Self',
+ fields=[
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+ ('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', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ('bpki_glue', rpki.fields.CertificateField(default=None, serialize=False, null=True, blank=True)),
+ ],
+ ),
+ migrations.AddField(
+ model_name='roa',
+ name='self',
+ field=models.ForeignKey(to='rpkidb.Self'),
+ ),
+ migrations.AddField(
+ model_name='repository',
+ name='self',
+ field=models.ForeignKey(to='rpkidb.Self'),
+ ),
+ migrations.AddField(
+ model_name='parent',
+ name='repository',
+ field=models.ForeignKey(to='rpkidb.Repository'),
+ ),
+ migrations.AddField(
+ model_name='parent',
+ name='self',
+ field=models.ForeignKey(to='rpkidb.Self'),
+ ),
+ migrations.AddField(
+ model_name='ghostbuster',
+ name='self',
+ field=models.ForeignKey(to='rpkidb.Self'),
+ ),
+ migrations.AddField(
+ model_name='eecert',
+ name='self',
+ field=models.ForeignKey(to='rpkidb.Self'),
+ ),
+ migrations.AddField(
+ model_name='child',
+ name='self',
+ field=models.ForeignKey(to='rpkidb.Self'),
+ ),
+ migrations.AddField(
+ model_name='ca',
+ name='parent',
+ field=models.ForeignKey(to='rpkidb.Parent'),
+ ),
+ migrations.AddField(
+ model_name='bsc',
+ name='self',
+ field=models.ForeignKey(to='rpkidb.Self'),
+ ),
+ migrations.AlterUniqueTogether(
+ name='repository',
+ unique_together=set([('self', 'repository_handle')]),
+ ),
+ migrations.AlterUniqueTogether(
+ name='parent',
+ unique_together=set([('self', 'parent_handle')]),
+ ),
+ migrations.AlterUniqueTogether(
+ name='child',
+ unique_together=set([('self', 'child_handle')]),
+ ),
+ migrations.AlterUniqueTogether(
+ name='bsc',
+ unique_together=set([('self', 'bsc_handle')]),
+ ),
+ ]
diff --git a/rpki/rpkidb/migrations/__init__.py b/rpki/rpkidb/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/rpki/rpkidb/migrations/__init__.py
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)