diff --git a/dpaste/forms.py b/dpaste/forms.py
index 2db6d1d..df5ce08 100644
--- a/dpaste/forms.py
+++ b/dpaste/forms.py
@@ -7,7 +7,6 @@ from django.utils.translation import ugettext_lazy as _
from dpaste.models import Snippet
from dpaste.highlight import LEXER_LIST, LEXER_DEFAULT
-
EXPIRE_CHOICES = (
(3600, _(u'In one hour')),
(3600 * 24 * 7, _(u'In one week')),
@@ -17,7 +16,7 @@ EXPIRE_DEFAULT = EXPIRE_CHOICES[2][0]
MAX_CONTENT_LENGTH = getattr(settings, 'DPASTE_MAX_CONTENT_LENGTH', 250*1024*1024)
MAX_SNIPPETS_PER_USER = getattr(settings, 'DPASTE_MAX_SNIPPETS_PER_USER', 15)
-\
+
class SnippetForm(forms.ModelForm):
content = forms.CharField(
label=_('Content'),
diff --git a/dpaste/highlight.py b/dpaste/highlight.py
index 84306b5..dc418fa 100644
--- a/dpaste/highlight.py
+++ b/dpaste/highlight.py
@@ -107,6 +107,9 @@ class NakedHtmlFormatter(HtmlFormatter):
yield i, t
def pygmentize(code_string, lexer_name=LEXER_DEFAULT):
- lexer = lexer_name and get_lexer_by_name(lexer_name) \
- or PythonLexer()
+ try:
+ lexer = lexer_name and get_lexer_by_name(lexer_name) \
+ or PythonLexer()
+ except Exception as e:
+ lexer = PythonLexer()
return highlight(code_string, lexer, NakedHtmlFormatter())
diff --git a/dpaste/static/dpaste/theme.css b/dpaste/static/dpaste/theme.css
index 915ce53..6595072 100644
--- a/dpaste/static/dpaste/theme.css
+++ b/dpaste/static/dpaste/theme.css
@@ -7,6 +7,11 @@ body {
padding: 10px 0 40px 0;
}
+tt strong {
+ background-color: #ffe699;
+ outline: 3px solid #ffe699;
+}
+
/* Custom container */
.container-fluid {
margin: 0 auto;
diff --git a/dpaste/templates/dpaste/about.html b/dpaste/templates/dpaste/about.html
index e5f0fdc..b2ed280 100644
--- a/dpaste/templates/dpaste/about.html
+++ b/dpaste/templates/dpaste/about.html
@@ -47,6 +47,33 @@
{% endfor %}
+
Snippets in the database
+
+
+
+
+
+
+ Delete a snippet
+
+
+ If you created a snippet with the API you can't delete it on the webpage
+ since it's not in your history. You can delete a snippet here. Actually
+ you can delete any snippet of anybody, as long as you know the short code.
+
+
+ If you deleted a snippet because auf legal issues, please let me know
+ that, I want to keep track of such things and try to avoid in future.
+
+
+ Type the 4 letter code of your snippet in the field and submit.
+ Like this yellow one here: http://dpaste.de/SiZrT
+
+
+
+
diff --git a/dpaste/templates/dpaste/snippet_details_raw.html b/dpaste/templates/dpaste/snippet_details_raw.html
index 47e704a..64e47b6 100644
--- a/dpaste/templates/dpaste/snippet_details_raw.html
+++ b/dpaste/templates/dpaste/snippet_details_raw.html
@@ -1 +1 @@
-{{ snippet.content|safe }}
\ No newline at end of file
+{{ snippet.content|safe }}
diff --git a/dpaste/urls/dpaste.py b/dpaste/urls/dpaste.py
index e85bb0f..2d1aa18 100644
--- a/dpaste/urls/dpaste.py
+++ b/dpaste/urls/dpaste.py
@@ -4,8 +4,9 @@ urlpatterns = patterns('dpaste.views',
url(r'^$', 'snippet_new', name='snippet_new'),
url(r'^diff/$', 'snippet_diff', name='snippet_diff'),
url(r'^history/$', 'snippet_history', name='snippet_history'),
+ url(r'^delete/$', 'snippet_delete', name='snippet_delete'),
url(r'^(?P[a-zA-Z0-9]+)/?$', 'snippet_details', name='snippet_details'),
url(r'^(?P[a-zA-Z0-9]+)/delete/$', 'snippet_delete', name='snippet_delete'),
url(r'^(?P[a-zA-Z0-9]+)/gist/$', 'snippet_gist', name='snippet_gist'),
- url(r'^(?P[a-zA-Z0-9]+)/raw/$', 'snippet_details', {'template_name': 'dpaste/snippet_details_raw.html', 'is_raw': True}, name='snippet_details_raw'),
+ url(r'^(?P[a-zA-Z0-9]+)/raw/?$', 'snippet_details', {'template_name': 'dpaste/snippet_details_raw.html', 'is_raw': True}, name='snippet_details_raw'),
)
diff --git a/dpaste/views.py b/dpaste/views.py
index 8a63559..d65628d 100644
--- a/dpaste/views.py
+++ b/dpaste/views.py
@@ -8,7 +8,7 @@ from django.template.context import RequestContext
from django.http import (Http404, HttpResponseRedirect, HttpResponseBadRequest,
HttpResponse, HttpResponseForbidden)
from django.conf import settings
-from django.core.exceptions import ObjectDoesNotExist
+from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from django.utils import simplejson
@@ -57,6 +57,10 @@ def snippet_details(request, snippet_id, template_name='dpaste/snippet_details.h
"""
try:
snippet = Snippet.objects.get(secret_id=snippet_id)
+ except MultipleObjectsReturned:
+ raise Http404('Multiple snippets exist for this slug. This should never '
+ 'happen but its likely that you are a spam bot, so I dont '
+ 'care.')
except ObjectDoesNotExist:
raise Http404('This snippet does not exist anymore. Its likely that its '
'lifetime is expired.')
@@ -80,8 +84,8 @@ def snippet_details(request, snippet_id, template_name='dpaste/snippet_details.h
template_context = {
'snippet_form': snippet_form,
- 'lexer_list': LEXER_LIST,
'snippet': snippet,
+ 'lexers': LEXER_LIST,
'lines': range(snippet.get_linecount()),
'tree': tree,
'wordwrap': snippet.lexer in LEXER_WORDWRAP and 'True' or 'False',
@@ -100,16 +104,19 @@ def snippet_details(request, snippet_id, template_name='dpaste/snippet_details.h
return response
-def snippet_delete(request, snippet_id):
+def snippet_delete(request, snippet_id=None):
"""
Delete a snippet. This is allowed by anybody as long as he knows the
snippet id. I got too many manual requests to do this, mostly for legal
reasons and the chance to abuse this is not given anyway, since snippets
always expire.
"""
+ snippet_id = snippet_id or request.POST.get('snippet_id')
+ if not snippet_id:
+ raise Http404('No snippet id given')
snippet = get_object_or_404(Snippet, secret_id=snippet_id)
snippet.delete()
- return HttpResponseRedirect(reverse('snippet_new'))
+ return HttpResponseRedirect(reverse('snippet_new') + '?delete=1')
def snippet_history(request, template_name='dpaste/snippet_list.html'):
diff --git a/server/nginx.conf b/server/nginx.conf
index 206f341..9d892e9 100644
--- a/server/nginx.conf
+++ b/server/nginx.conf
@@ -25,7 +25,7 @@ server {
# -----------------------------------------------------------------------------
server {
listen 443;
- server_name dpaste.de;
+ server_name dpaste.de www.dpaste.de;
ssl on;
ssl_certificate /srv/dpaste.de/var/ssl/dpaste_de_unified.crt;
@@ -33,7 +33,7 @@ server {
# Rewrite www to non-www
- if ($host ~ /^www\./) {
+ if ($host = www.dpaste.de) {
rewrite ^/(.*)$ https://dpaste.de/$1 permanent;
}
@@ -44,7 +44,7 @@ server {
server {
listen 443;
- server_name dpaste.org;
+ server_name dpaste.org www.dpaste.org;
ssl on;
ssl_certificate /srv/dpaste.de/var/ssl/dpaste_org_unified.crt;
@@ -53,7 +53,7 @@ server {
add_header Strict-Transport-Security max-age=25200;
# Rewrite www to non-www
- if ($host ~ /^www\./) {
+ if ($host = www.dpaste.org) {
rewrite ^/(.*)$ https://dpaste.org/$1 permanent;
}