diff --git a/web/warpauth/urls.py b/web/warpauth/urls.py index 8e5288b7b02b18dd54b3beb89c5214677b4bb245..43e8545b50b843cdd3fb11da4250efcb802feeef 100644 --- a/web/warpauth/urls.py +++ b/web/warpauth/urls.py @@ -1,5 +1,10 @@ from django.conf.urls import url from warpauth.views import main, login, reset_password, profile +from warpauth.views.admin import dashboard +# +# Definition of all available URLS for accessing Functions integrated in WarpAuth +# + urlpatterns = [ # Authentication Pages @@ -12,7 +17,4 @@ urlpatterns = [ url(r'^profile/$', profile.index, name='index'), url(r'^profile/change_password/$', profile.change_password, name='change_password'), - # Main Page - url(r'^$', main.index, name='index'), - ] diff --git a/web/warpmain/__init__.py b/web/warpmain/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/web/warpmain/admin.py b/web/warpmain/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..d7158643808bbf4723a33d253975c604d8d9f8bd --- /dev/null +++ b/web/warpmain/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin + +# Register your models here. +from warpmain.models import News + + +@admin.register(News) +class NewsAdmin(admin.ModelAdmin): + pass diff --git a/web/warpmain/apps.py b/web/warpmain/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..2210c9a2dea6a10729568c39ccc3a67e62bb0d7e --- /dev/null +++ b/web/warpmain/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class WarpmainConfig(AppConfig): + name = 'warpmain' diff --git a/web/warpmain/migrations/__init__.py b/web/warpmain/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/web/warpmain/models.py b/web/warpmain/models.py new file mode 100644 index 0000000000000000000000000000000000000000..04cddfa58a8c96c5e3b9bdfe6f70ae07c066f489 --- /dev/null +++ b/web/warpmain/models.py @@ -0,0 +1,20 @@ +from __future__ import unicode_literals + +from django.db import models +from django.forms import ModelForm + + +class News(models.Model): + user = models.CharField(max_length=100, null=True) + title = models.CharField(max_length=100) + message = models.TextField() + created = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.title + + +class NewsForm(ModelForm): + class Meta: + model = News + fields = ['title', 'message'] diff --git a/web/warpmain/templates/warpmain/about.html b/web/warpmain/templates/warpmain/about.html new file mode 100644 index 0000000000000000000000000000000000000000..52f6b2fe1af3dabb97993057af2641e535ffd3e9 --- /dev/null +++ b/web/warpmain/templates/warpmain/about.html @@ -0,0 +1,55 @@ +{% extends "base.html" %} +{% load i18n %} +{% block content %} + + <h2>{% trans "About" %}</h2> + + <p class="lead">Welcome to Warpzone Internal</p> + <p> + <img class="img-responsive" style="margin-left: 100px; display: inline; float:right" src="/media/warpzone_logo_orig.png"> + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + </p> + + <a href="http://www.warpzone.ms/" target="_blank" class="btn btn-default btn-default"> + <span class="glyphicon glyphicon-home" aria-hidden="true"></span> {% trans "Visit us!" %} + </a> + + <h3>License</h3> + <button data-toggle="modal" data-target="#Modal" class="btn btn-default"> + <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> Licenses + </button> + + <h3>Support</h3> + <p>{% trans "If you have any questions about this software, feel free to contact me or one of the coders club:"%}</p> + <a href="mailto:dresen@itsecteam.ms" style="text-decoration: none;"> + <button type="button" class="btn btn-default"> + <span class="glyphicon glyphicon-envelope" aria-hidden="true"></span> dresen@itsecteam.ms + </button> + </a> + <br> + <br> + <br> + <br> + <img height="40px" src="/media/django_logo.gif"> + + <div class="modal fade" id="Modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog modal-lg" role="document" "> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span></button> + <h4 class="modal-title" id="myModalLabel">Open Source Licenses</h4> + </div> + <div class="modal-body"> + <h3>django</h3><br> + <pre>{% include "licenses/django.txt" %}</pre> + </div> + <div class="modal-body"> + <h3>chart.js</h3><br> + <pre>{% include "licenses/chart_js.txt" %}</pre> + </div> + </div> + </div> + </div> + +{% endblock %} diff --git a/web/warpmain/templates/warpmain/admin/dashboard.html b/web/warpmain/templates/warpmain/admin/dashboard.html new file mode 100644 index 0000000000000000000000000000000000000000..0914eaf035fdc087df14878a3dec08f7e93d329d --- /dev/null +++ b/web/warpmain/templates/warpmain/admin/dashboard.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} + +{% block content %} + + HAllo +{% endblock %} \ No newline at end of file diff --git a/web/warpmain/templates/warpmain/admin/news.html b/web/warpmain/templates/warpmain/admin/news.html new file mode 100644 index 0000000000000000000000000000000000000000..ca145db3d875ede5100c2d6f8dd57656180154f6 --- /dev/null +++ b/web/warpmain/templates/warpmain/admin/news.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} +{% load humanize %} +{% load i18n %} +{% load bootstrap %} +{% block content %} + <div class="panel panel-default"> + <div class="panel-body"> + <form class="form-horizontal" method="POST" role="form"> + {{ create_news_form | bootstrap_horizontal }} + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + {% csrf_token %} + <button style="float: left" type="submit" formmethod="post" class="btn btn-primary">{% trans "Create News" %}</button> + </div> + </div> + </form> + </div> + </div> + {% for news in news_list %} + <div class="panel panel-primary"> + <div class="panel-heading"> + <span class="lead">{{ news.title }}</span> + </div> + <div class="panel-body"> + {{ news.message }} + </div> + <div class="panel-footer"> + {% trans "Created by" %} {{ news.user }} {{ news.created | naturaltime }} + </div> + </div> + {% endfor %} +{% endblock %} diff --git a/web/warpmain/templates/warpmain/main.html b/web/warpmain/templates/warpmain/main.html new file mode 100644 index 0000000000000000000000000000000000000000..ac5d1cd430be26ee01fa20a42dfdef5f5d389872 --- /dev/null +++ b/web/warpmain/templates/warpmain/main.html @@ -0,0 +1,21 @@ +{% extends "base.html" %} +{% load humanize %} +{% load i18n %} +{% block content %} + + <h2>{% trans "News" %}</h2> + + {% for news in news_list %} + <div class="panel panel-primary"> + <div class="panel-heading"> + <span class="lead">{{ news.title }}</span> + </div> + <div class="panel-body"> + {{ news.message }} + </div> + <div class="panel-footer"> + {% trans "Created by" %} {{ news.user }} {{ news.created | naturaltime }} + </div> + </div> + {% endfor %} +{% endblock %} \ No newline at end of file diff --git a/web/warpmain/tests.py b/web/warpmain/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6 --- /dev/null +++ b/web/warpmain/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/web/warpmain/urls.py b/web/warpmain/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..e856de44851ee7872f7fc81b6f0ff6acfa3f94c0 --- /dev/null +++ b/web/warpmain/urls.py @@ -0,0 +1,16 @@ +from django.conf.urls import url +from warpmain.views import main +from warpmain.views.admin import dashboard, news + +# ToDo: Use name tag of URL for Page Title +urlpatterns = [ + + url(r'^$', main.index, name='News'), + + url(r'^about/$', main.about, name='About'), + url(r'^administration/$', dashboard.index, name='admin_dashboard'), + url(r'^administration/news/$', news.news, name='admin_news'), + + +] + diff --git a/web/warpmain/views/__init__.py b/web/warpmain/views/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..9847ec9e1fa3021cc35dac064fda36bb17e6bf01 --- /dev/null +++ b/web/warpmain/views/__init__.py @@ -0,0 +1 @@ +__author__ = 'chris' diff --git a/web/warpmain/views/admin/__init__.py b/web/warpmain/views/admin/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/web/warpmain/views/admin/dashboard.py b/web/warpmain/views/admin/dashboard.py new file mode 100644 index 0000000000000000000000000000000000000000..ece7aa56ada6e9cf16c5403b5e0a511d227333db --- /dev/null +++ b/web/warpmain/views/admin/dashboard.py @@ -0,0 +1,10 @@ +from django.shortcuts import render +from django.http import HttpResponse +from django.contrib.auth.decorators import login_required +from warpauth.util import * + + +@login_required(login_url='/login/', redirect_field_name=None) +def index(request): + return HttpResponse(render(request, 'warpmain/admin/dashboard.html', pages)) + diff --git a/web/warpmain/views/admin/news.py b/web/warpmain/views/admin/news.py new file mode 100644 index 0000000000000000000000000000000000000000..f0a11dc4b15bd6b81e5598d465467230c384b9ae --- /dev/null +++ b/web/warpmain/views/admin/news.py @@ -0,0 +1,31 @@ +from django.shortcuts import render, redirect +from django.http import HttpResponse +from django.contrib.auth.decorators import login_required +from warpauth.util import * +from warpmain.models import News, NewsForm + +# ToDo: Not ready yet + +@login_required(login_url='/login/', redirect_field_name=None) +def news(request, news_id=0): + if request.method == "POST": + news_form = NewsForm(request.POST) + if news_form.is_valid(): + news = news_form.save() + news.user = request.user.ldap_username + news.save() + return redirect("/administration/news/") + else: + pages['create_news_form'] = news_form + + else: + pages['news_list'] = News.objects.order_by("created") + pages['create_news_form'] = NewsForm() + if news_id != 0: + pages['create_news_form'] = NewsForm(News.objects.get(id=news_id)) + + return HttpResponse(render(request, 'warpmain/admin/news.html', pages)) + +@login_required(login_url='/login/', redirect_field_name=None) +def news_delete(request, news_id=0): + pass \ No newline at end of file diff --git a/web/warpmain/views/main.py b/web/warpmain/views/main.py new file mode 100644 index 0000000000000000000000000000000000000000..3d187b5c4ef1d8143666495a39d851d241c39fe6 --- /dev/null +++ b/web/warpmain/views/main.py @@ -0,0 +1,14 @@ +from django.shortcuts import render +from django.http import HttpResponse +from django.contrib.auth.decorators import login_required +from warpauth.util import * +from warpmain.models import News + + +@login_required(login_url='/login/', redirect_field_name=None) +def index(request): + pages['news_list'] = News.objects.order_by("created") + return HttpResponse(render(request, 'warpmain/main.html', pages)) + +def about(request): + return HttpResponse(render(request, 'warpmain/about.html', pages)) diff --git a/web/warpzone/settings.py b/web/warpzone/settings.py index 34128273b2a2b720c0d41a9e3026ac1cb96444d2..6ceebef7e727572986df19e6945a6238eecd77d3 100644 --- a/web/warpzone/settings.py +++ b/web/warpzone/settings.py @@ -10,6 +10,14 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.8/ref/settings/ """ +# +# MAIN TO DO LIST +# +# ToDo: Add Content Security Policy +# ToDo: Fix UTF-8 for all Strings + + + # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os import ldap @@ -43,7 +51,9 @@ INSTALLED_APPS = ( 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.humanize', 'bootstrapform', + 'warpmain', 'warpauth', 'warpfood', ) @@ -79,6 +89,9 @@ TEMPLATES = [ WSGI_APPLICATION = 'warpzone.wsgi.application' +LOCALE_PATHS = ( + os.path.join(BASE_DIR, 'locale'), +) # Database # https://docs.djangoproject.com/en/1.8/ref/settings/#databases @@ -90,7 +103,8 @@ DATABASES = { }, 'ldap': { 'ENGINE': 'ldapdb.backends.ldap', - 'NAME': 'ldap://s1.dyhost.de/', + # 'NAME': 'ldap://s1.dyhost.de/', + 'NAME': 'ldap://localhost/', 'USER': 'cn=admin,dc=warpzone,dc=ms', 'PASSWORD': '12345', } @@ -121,21 +135,28 @@ AUTHENTICATION_BACKENDS = ( ) -AUTH_LDAP_SERVER_URI = "ldap://s1.dyhost.de" +# +# AUTH LDAP SETTINGS +# + +# AUTH_LDAP_SERVER_URI = "ldap://s1.dyhost.de" +AUTH_LDAP_SERVER_URI = "ldap://localhost" AUTH_LDAP_BIND_DN = "cn=admin,dc=warpzone,dc=ms" AUTH_LDAP_BIND_PASSWORD = "12345" -LDAP_USER_SEARCH_PATH = "ou=User,dc=warpzone,dc=ms" -AUTH_LDAP_USER_SEARCH = LDAPSearch(LDAP_USER_SEARCH_PATH, - ldap.SCOPE_SUBTREE, "(uid=%(user)s)") +AUTH_LDAP_USER_SEARCH_PATH = "ou=User,dc=warpzone,dc=ms" +AUTH_LDAP_USER_SEARCH_FILTER = "(uid=%(user)s)" + +AUTH_LDAP_USER_SEARCH = LDAPSearch(AUTH_LDAP_USER_SEARCH_PATH, + ldap.SCOPE_SUBTREE, AUTH_LDAP_USER_SEARCH_FILTER) AUTH_LDAP_USER_ATTR_MAP = {"first_name": "givenName", "last_name": "sn", "email": "description"} AUTH_LDAP_PROFILE_ATTR_MAP = {"home_directory": "homeDirectory"} - -AUTH_LDAP_GROUP_SEARCH = LDAPSearch("ou=Groups,dc=warpzone,dc=ms", +AUTH_LDAP_GROUP_SEARCH_PATH = "ou=Groups,dc=warpzone,dc=ms" +AUTH_LDAP_GROUP_SEARCH = LDAPSearch(AUTH_LDAP_GROUP_SEARCH_PATH, ldap.SCOPE_SUBTREE, "(objectClass=posixGroup)" ) @@ -157,3 +178,9 @@ logger = logging.getLogger('django_auth_ldap') logger.addHandler(logging.StreamHandler()) logger.setLevel(logging.DEBUG) +# +# MISC +# + +# Lifetime of Password Reset Token in Minutes +PW_RESET_TOKEN_LIFETIME = 5 diff --git a/web/warpzone/urls.py b/web/warpzone/urls.py index 9bbe71e607052b7838a7a6fd1fbcb2405aa41f4e..43d6230c1998c90d259d8d7ec84bc8470bc431aa 100644 --- a/web/warpzone/urls.py +++ b/web/warpzone/urls.py @@ -1,11 +1,12 @@ +import django from django.conf.urls import include, url from django.contrib import admin from django.conf import settings - urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, }), + url(r'^', include('warpmain.urls')), url(r'^', include('warpauth.urls')), url(r'^', include('warpfood.urls')), ]