Merge branch 'master' of github.com:asmaps/nsupdate.info
This commit is contained in:
commit
750b264fdf
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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']
|
@ -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
|
||||||
|
@ -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 %}
|
||||||
|
@ -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'
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user