diff options
Diffstat (limited to 'rpkid/rpki/gui/app/models.py')
-rw-r--r-- | rpkid/rpki/gui/app/models.py | 420 |
1 files changed, 0 insertions, 420 deletions
diff --git a/rpkid/rpki/gui/app/models.py b/rpkid/rpki/gui/app/models.py deleted file mode 100644 index 7d643fdc..00000000 --- a/rpkid/rpki/gui/app/models.py +++ /dev/null @@ -1,420 +0,0 @@ -# Copyright (C) 2010 SPARTA, Inc. dba Cobham Analytic Solutions -# Copyright (C) 2012 SPARTA, Inc. a Parsons Company -# -# Permission to use, copy, modify, and distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND SPARTA DISCLAIMS ALL WARRANTIES WITH -# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -# AND FITNESS. IN NO EVENT SHALL SPARTA BE LIABLE FOR ANY SPECIAL, DIRECT, -# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -# PERFORMANCE OF THIS SOFTWARE. - -__version__ = '$Id$' - -from django.db import models -from django.contrib.auth.models import User -from django.core.mail import send_mail - -import rpki.resource_set -import rpki.exceptions -import rpki.irdb.models -import rpki.gui.models -import rpki.gui.routeview.models -from south.modelsinspector import add_introspection_rules - - -class TelephoneField(models.CharField): - def __init__(self, **kwargs): - if 'max_length' not in kwargs: - kwargs['max_length'] = 40 - models.CharField.__init__(self, **kwargs) - -add_introspection_rules([], ['^rpki\.gui\.app\.models\.TelephoneField']) - - -class Parent(rpki.irdb.models.Parent): - """proxy model for irdb Parent""" - - def __unicode__(self): - return u"%s's parent %s" % (self.issuer.handle, self.handle) - - @models.permalink - def get_absolute_url(self): - return ('rpki.gui.app.views.parent_detail', [str(self.pk)]) - - class Meta: - proxy = True - - -class Child(rpki.irdb.models.Child): - """proxy model for irdb Child""" - - def __unicode__(self): - return u"%s's child %s" % (self.issuer.handle, self.handle) - - @models.permalink - def get_absolute_url(self): - return ('rpki.gui.app.views.child_detail', [str(self.pk)]) - - class Meta: - proxy = True - verbose_name_plural = 'children' - - -class ChildASN(rpki.irdb.models.ChildASN): - """Proxy model for irdb ChildASN.""" - - class Meta: - proxy = True - - def __unicode__(self): - return u'AS%s' % self.as_resource_range() - - -class ChildNet(rpki.irdb.models.ChildNet): - """Proxy model for irdb ChildNet.""" - - class Meta: - proxy = True - - def __unicode__(self): - return u'%s' % self.as_resource_range() - - -class Alert(models.Model): - """Stores alert messages intended to be consumed by the user.""" - - INFO = 0 - WARNING = 1 - ERROR = 2 - - SEVERITY_CHOICES = ( - (INFO, 'info'), - (WARNING, 'warning'), - (ERROR, 'error'), - ) - - conf = models.ForeignKey('Conf', related_name='alerts') - severity = models.SmallIntegerField(choices=SEVERITY_CHOICES, default=INFO) - when = models.DateTimeField(auto_now_add=True) - seen = models.BooleanField(default=False) - subject = models.CharField(max_length=66) - text = models.TextField() - - @models.permalink - def get_absolute_url(self): - return ('alert-detail', [str(self.pk)]) - - -class Conf(rpki.irdb.models.ResourceHolderCA): - """This is the center of the universe, also known as a place to - have a handle on a resource-holding entity. It's the <self> - in the rpkid schema. - - """ - @property - def parents(self): - """Simulates irdb.models.Parent.objects, but returns app.models.Parent - proxy objects. - - """ - return Parent.objects.filter(issuer=self) - - @property - def children(self): - """Simulates irdb.models.Child.objects, but returns app.models.Child - proxy objects. - - """ - return Child.objects.filter(issuer=self) - - @property - def ghostbusters(self): - return GhostbusterRequest.objects.filter(issuer=self) - - @property - def repositories(self): - return Repository.objects.filter(issuer=self) - - @property - def roas(self): - return ROARequest.objects.filter(issuer=self) - - @property - def routes(self): - """Return all IPv4 routes covered by RPKI certs issued to this resource - holder. - - """ - # build a Q filter to select all RouteOrigin objects covered by - # prefixes in the resource holder's certificates - q = models.Q() - for p in ResourceRangeAddressV4.objects.filter(cert__conf=self): - q |= models.Q(prefix_min__gte=p.prefix_min, - prefix_max__lte=p.prefix_max) - return RouteOrigin.objects.filter(q) - - @property - def routes_v6(self): - """Return all IPv6 routes covered by RPKI certs issued to this resource - holder. - - """ - # build a Q filter to select all RouteOrigin objects covered by - # prefixes in the resource holder's certificates - q = models.Q() - for p in ResourceRangeAddressV6.objects.filter(cert__conf=self): - q |= models.Q(prefix_min__gte=p.prefix_min, - prefix_max__lte=p.prefix_max) - return RouteOriginV6.objects.filter(q) - - def send_alert(self, subject, message, from_email, severity=Alert.INFO): - """Store an alert for this resource holder.""" - self.alerts.create(subject=subject, text=message, severity=severity) - - send_mail( - subject=subject, - message=message, - from_email=from_email, - recipient_list=self.email_list - ) - - @property - def email_list(self): - """Return a list of the contact emails for this resource holder. - - Contact emails are extract from any ghostbuster requests, and any - linked user accounts. - - """ - notify_emails = [gbr.email_address for gbr in self.ghostbusters if gbr.email_address] - notify_emails.extend( - [acl.user.email for acl in ConfACL.objects.filter(conf=self) if acl.user.email] - ) - return notify_emails - - def clear_alerts(self): - self.alerts.all().delete() - - - class Meta: - proxy = True - - -class ResourceCert(models.Model): - """Represents a resource certificate. - - This model is used to cache the output of <list_received_resources/>. - - """ - - # Handle to which this cert was issued - conf = models.ForeignKey(Conf, related_name='certs') - - # The parent that issued the cert. This field is marked null=True because - # the root has no parent - parent = models.ForeignKey(Parent, related_name='certs', null=True) - - # certificate validity period - not_before = models.DateTimeField() - not_after = models.DateTimeField() - - # Locator for this object. Used to look up the validation status, expiry - # of ancestor certs in cacheview - uri = models.CharField(max_length=255) - - def __unicode__(self): - if self.parent: - return u"%s's cert from %s" % (self.conf.handle, - self.parent.handle) - else: - return u"%s's root cert" % self.conf.handle - - def get_cert_chain(self): - """Return a list containing the complete certificate chain for this - certificate.""" - cert = self - x = [cert] - while cert.issuer: - cert = cert.issuer - x.append(cert) - x.reverse() - return x - cert_chain = property(get_cert_chain) - - -class ResourceRangeAddressV4(rpki.gui.models.PrefixV4): - cert = models.ForeignKey(ResourceCert, related_name='address_ranges') - - -class ResourceRangeAddressV6(rpki.gui.models.PrefixV6): - cert = models.ForeignKey(ResourceCert, related_name='address_ranges_v6') - - -class ResourceRangeAS(rpki.gui.models.ASN): - cert = models.ForeignKey(ResourceCert, related_name='asn_ranges') - - -class ROARequest(rpki.irdb.models.ROARequest): - class Meta: - proxy = True - - def __unicode__(self): - return u"%s's ROA request for AS%d" % (self.issuer.handle, self.asn) - - @models.permalink - def get_absolute_url(self): - return ('rpki.gui.app.views.roa_detail', [str(self.pk)]) - - @property - def routes(self): - "Return all IPv4 routes covered by this roa prefix." - # this assumes one prefix per ROA - rng = self.prefixes.filter(version=4)[0].as_resource_range() - return rpki.gui.routeview.models.RouteOrigin.objects.filter( - prefix_min__gte=rng.min, - prefix_max__lte=rng.max - ) - - @property - def routes_v6(self): - "Return all IPv6 routes covered by this roa prefix." - # this assumes one prefix per ROA - rng = self.prefixes.filter(version=6)[0].as_resource_range() - return rpki.gui.routeview.models.RouteOriginV6.objects.filter( - prefix_min__gte=rng.min, - prefix_max__lte=rng.max - ) - - -class ROARequestPrefix(rpki.irdb.models.ROARequestPrefix): - class Meta: - proxy = True - - def __unicode__(self): - return u'ROA Request Prefix %s' % str(self.as_roa_prefix()) - - -class GhostbusterRequest(rpki.irdb.models.GhostbusterRequest): - """ - Stores the information require to fill out a vCard entry to - populate a ghostbusters record. - - This model is inherited from the irdb GhostBusterRequest model so - that the broken out fields can be included for ease of editing. - """ - - full_name = models.CharField(max_length=40) - - # components of the vCard N type - family_name = models.CharField(max_length=20) - given_name = models.CharField(max_length=20) - additional_name = models.CharField(max_length=20, blank=True, null=True) - honorific_prefix = models.CharField(max_length=10, blank=True, null=True) - honorific_suffix = models.CharField(max_length=10, blank=True, null=True) - - email_address = models.EmailField(blank=True, null=True) - organization = models.CharField(blank=True, null=True, max_length=255) - telephone = TelephoneField(blank=True, null=True) - - # elements of the ADR type - box = models.CharField(verbose_name='P.O. Box', blank=True, null=True, - max_length=40) - extended = models.CharField(blank=True, null=True, max_length=255) - street = models.CharField(blank=True, null=True, max_length=255) - city = models.CharField(blank=True, null=True, max_length=40) - region = models.CharField(blank=True, null=True, max_length=40, - help_text='state or province') - code = models.CharField(verbose_name='Postal Code', blank=True, null=True, - max_length=40) - country = models.CharField(blank=True, null=True, max_length=40) - - def __unicode__(self): - return u"%s's GBR: %s" % (self.issuer.handle, self.full_name) - - @models.permalink - def get_absolute_url(self): - return ('gbr-detail', [str(self.pk)]) - - class Meta: - ordering = ('family_name', 'given_name') - - -class Timestamp(models.Model): - """Model to hold metadata about the collection of external data. - - This model is a hash table mapping a timestamp name to the - timestamp value. All timestamps values are in UTC. - - The utility function rpki.gui.app.timestmap.update(name) should be used to - set timestamps rather than updating this model directly.""" - - name = models.CharField(max_length=30, primary_key=True) - ts = models.DateTimeField(null=False) - - def __unicode__(self): - return '%s: %s' % (self.name, self.ts) - - -class Repository(rpki.irdb.models.Repository): - class Meta: - proxy = True - verbose_name = 'Repository' - verbose_name_plural = 'Repositories' - - @models.permalink - def get_absolute_url(self): - return ('rpki.gui.app.views.repository_detail', [str(self.pk)]) - - def __unicode__(self): - return "%s's repository %s" % (self.issuer.handle, self.handle) - - -class Client(rpki.irdb.models.Client): - "Proxy model for pubd clients." - - class Meta: - proxy = True - verbose_name = 'Client' - - @models.permalink - def get_absolute_url(self): - return ('rpki.gui.app.views.client_detail', [str(self.pk)]) - - def __unicode__(self): - return self.handle - - -class RouteOrigin(rpki.gui.routeview.models.RouteOrigin): - class Meta: - proxy = True - - @models.permalink - def get_absolute_url(self): - return ('rpki.gui.app.views.route_detail', [str(self.pk)]) - - -class RouteOriginV6(rpki.gui.routeview.models.RouteOriginV6): - class Meta: - proxy = True - - @models.permalink - def get_absolute_url(self): - return ('rpki.gui.app.views.route_detail', [str(self.pk)]) - - -class ConfACL(models.Model): - """Stores access control for which users are allowed to manage a given - resource handle. - - """ - - conf = models.ForeignKey(Conf) - user = models.ForeignKey(User) - - class Meta: - unique_together = (('user', 'conf')) |