Merge branch 'master' of github.com:asmaps/nsupdate.info

This commit is contained in:
Fabian Faessler 2013-09-29 19:58:15 +02:00
commit 750b264fdf
6 changed files with 155 additions and 23 deletions

View File

@ -5,7 +5,7 @@ and your address will be removed from our records.
To activate this account, please click the following link within the next To activate this account, please click the following link within the next
{{ expiration_days }} days: {{ expiration_days }} days:
http://{{ site.domain }}{% url 'registration_activate' %} http://{{ site.domain }}{% url 'registration_activate' activation_key %}
Sincerely, Sincerely,
{{ site.name }} Management {{ site.name }} Management

View File

@ -87,7 +87,7 @@ def check_api_auth(username, password):
:return: True if authenticated, False otherwise. :return: True if authenticated, False otherwise.
""" """
fqdn = username fqdn = username
hosts = Host.objects.filter(fqdn=fqdn) hosts = Host.filter_by_fqdn(fqdn)
num_hosts = len(hosts) num_hosts = len(hosts)
if num_hosts == 0: if num_hosts == 0:
return False return False
@ -106,7 +106,8 @@ def check_session_auth(user, hostname):
:param hostname: fqdn :param hostname: fqdn
:return: True if hostname is owned by this user, False otherwise. :return: True if hostname is owned by this user, False otherwise.
""" """
hosts = Host.objects.filter(fqdn=hostname, created_by=user) fqdn = hostname
hosts = Host.filter_by_fqdn(fqdn, created_by=user)
num_hosts = len(hosts) num_hosts = len(hosts)
if num_hosts == 0: if num_hosts == 0:
return False return False

View File

@ -0,0 +1,90 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Changing field 'Domain.created_by'
db.alter_column(u'main_domain', 'created_by_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True))
def backwards(self, orm):
# User chose to not deal with backwards NULL issues for 'Domain.created_by'
raise RuntimeError("Cannot reverse this migration. 'Domain.created_by' and its values cannot be restored.")
# The following code is provided here to aid in writing a correct migration
# Changing field 'Domain.created_by'
db.alter_column(u'main_domain', 'created_by_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User']))
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'main.blacklisteddomain': {
'Meta': {'object_name': 'BlacklistedDomain'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
'domain': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_update': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
},
u'main.domain': {
'Meta': {'object_name': 'Domain'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'created_by': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
'domain': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_update': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
},
u'main.host': {
'Meta': {'unique_together': "(('subdomain', 'domain'),)", 'object_name': 'Host'},
'comment': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'null': 'True', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'created_by': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hosts'", 'to': u"orm['auth.User']"}),
'domain': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Domain']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_update': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'subdomain': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
'update_secret': ('django.db.models.fields.CharField', [], {'max_length': '256'})
}
}
complete_apps = ['main']

View File

@ -67,7 +67,16 @@ class Host(models.Model):
unique_together = (('subdomain', 'domain'),) unique_together = (('subdomain', 'domain'),)
def get_fqdn(self): def get_fqdn(self):
return self.subdomain+'.'+self.domain.domain return '%s.%s' % (self.subdomain, self.domain.domain)
@classmethod
def filter_by_fqdn(cls, fqdn, **kwargs):
# Assuming subdomain has no dots (.) the fqdn is split at the first dot
splitted = fqdn.split('.', 1)
if not len(splitted) == 2:
raise NotImplemented("FQDN has to contain a dot")
return Host.objects.filter(
subdomain=splitted[0], domain__domain=splitted[1], **kwargs)
def generate_secret(self): def generate_secret(self):
# note: we use a quick hasher for the update_secret as expensive # note: we use a quick hasher for the update_secret as expensive

View File

@ -2,20 +2,52 @@
{% load bootstrap %} {% load bootstrap %}
{% block content %} {% block content %}
<h1>About page</h1> <h1>About this service</h1>
<p>You take the blue pill, the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill, you stay in Wonderland, and I show you how deep the rabbit hole goes.</p> <h2>What's this?</h2>
<h2>About nsupdate.info</h2> <p>
<p>nsupdate.info is the idea of a really simple single purpose dynamic dns nsupdate.info is a dynamic dns service.
service. Unlike other dynamic dns services its intention is that you do not </p>
have to click a link every 30 days to keep your domain enabled or other <p>
jokes like this.</p> You usually need it so your router (or other dyndns2-compatible
<h2>Features</h2> client) can update a hostname, so you don't need to know or find
<div class="well"> out your current IP address.
<i class="icon icon-ok"></i> Open-Source<br> </p>
<i class="icon icon-ok"></i> Free<br> <h2>Why another one?</h2>
<i class="icon icon-ok"></i> Easy<br> <p>
<i class="icon icon-ok"></i> Fast<br> We wanted a simple, usable, secure and free dynamic dns service.
<i class="icon icon-ok"></i> Awesome<br> That is not nagging its users with advertisements, spam, having
<i class="icon icon-ok"></i> Made with love<br> to log in regularly or cancelling his hosts after a short time of non-usage.
</div> That is not hiding the few free features almost undiscoverable between
a ton of features that are only for paying users.
</p>
<h2>Who are we?</h2>
<p>
Just some geeks wanting some free and open source software and a free service.
</p>
<h1>Fair use</h1>
<p>
The only thing we expect from you is fair use of this service:
<ul>
<li>Don't abuse the service in any way.</li>
<li>Don't update your hosts too often.</li>
<li>Don't do updates if your IP did not change.</li>
<li>Don't create lots of users or lots of hosts.</li>
<li>Don't use the service for any illegal or otherwise questionable purpose.</li>
<li>Don't spam us via e-mail.</li>
</ul>
</p>
<p>
We reserve the right to remove any account or hostname(s) that are
related to unfair use of the service - at any time and without prior notice.
</p>
<h1>No warranties</h1>
<p>
This is a free service, there are no warranties. If it breaks, it breaks.
</p>
<h1>Contact</h1>
info AT nsupdate DOT info
{% endblock %} {% endblock %}

View File

@ -31,9 +31,9 @@ SERVER = '85.10.192.104' # ns1.thinkmo.de (master / dynamic upd server for nsup
BASEDOMAIN = 'nsupdate.info' BASEDOMAIN = 'nsupdate.info'
NONEXISTING_HOST = 'nonexisting.' + BASEDOMAIN NONEXISTING_HOST = 'nonexisting.' + BASEDOMAIN
WWW_HOST = 'www.' + BASEDOMAIN WWW_HOST = BASEDOMAIN
WWW_IPV4_HOST = 'www.ipv4.' + BASEDOMAIN WWW_IPV4_HOST = 'ipv4.' + BASEDOMAIN
WWW_IPV6_HOST = 'www.ipv6.' + BASEDOMAIN WWW_IPV6_HOST = 'ipv6.' + BASEDOMAIN
WWW_IPV4_IP = '178.32.221.14' WWW_IPV4_IP = '178.32.221.14'
WWW_IPV6_IP = '2001:41d0:8:e00e::1' WWW_IPV6_IP = '2001:41d0:8:e00e::1'