Dropping passwords.

This commit is contained in:
Julien Palard 2023-04-21 09:33:26 +02:00
parent 177461812f
commit 47360a3320
Signed by: mdk
GPG Key ID: 0EFC1AC1006886F8
9 changed files with 69 additions and 118 deletions

View File

@ -16,7 +16,6 @@ class PasteForm(ModelForm):
fields = [
"language",
"title",
"password",
"content",
"lifetime",
"lifecount",
@ -28,8 +27,6 @@ class PasteForm(ModelForm):
paste.compute_size()
if not self.cleaned_data["title"]:
paste.title = "no title"
if self.cleaned_data["password"]:
paste.set_password(self.cleaned_data["password"])
if commit:
paste.save()
return paste

View File

@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-04-21 09:18+0200\n"
"POT-Creation-Date: 2023-04-21 09:32+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -15,27 +15,27 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: paste/models.py:12
#: paste/models.py:10
msgid "Never expire"
msgstr "Jamais"
#: paste/models.py:13
#: paste/models.py:11
msgid "1 hour"
msgstr "1 heure"
#: paste/models.py:14
#: paste/models.py:12
msgid "1 day"
msgstr "1 jour"
#: paste/models.py:15
#: paste/models.py:13
msgid "1 week"
msgstr "1 semaine"
#: paste/models.py:16
#: paste/models.py:14
msgid "1 month"
msgstr ""
#: paste/models.py:17
#: paste/models.py:15
msgid "1 year"
msgstr ""
@ -105,17 +105,7 @@ msgstr "Protection"
msgid "Views"
msgstr "Vues"
#: paste/templates/paste/history.html:27
#: paste/templates/paste/paste-meta.html:20
msgid "locked"
msgstr "verrouillé"
#: paste/templates/paste/history.html:27
#: paste/templates/paste/paste-meta.html:20
msgid "open"
msgstr "ouvert"
#: paste/templates/paste/history.html:32
#: paste/templates/paste/history.html:31
msgid "Nothing has been pasted yet"
msgstr "Rien n'a encore été collé"
@ -136,41 +126,42 @@ msgid "Expire allowed views"
msgstr "Expiration nombre d'affichages"
#: paste/templates/paste/index.html:63
msgid "Password protected"
msgstr "Protection par mot de passe"
#: paste/templates/paste/index.html:74
msgid "Paste"
msgstr "Coller"
#: paste/templates/paste/locked.html:7
msgid "This paste is password protected"
msgstr "Protégé par un mot de passe"
#: paste/templates/paste/locked.html:8
msgid ""
"Please enter the password in the field below to unlock the paste and display "
"it"
msgstr ""
"Veuillez entrer le mot de passe dans le champ ci-dessous pour déverrouiller "
"le collage et l'afficher"
#: paste/templates/paste/locked.html:12
msgid "Password"
msgstr "Mot de passe"
#: paste/templates/paste/locked.html:20
msgid "Unlock"
msgstr "Déverrouiller"
#: paste/templates/paste/paste-meta.html:10
msgid "Visibility"
msgstr "Visibilité"
#: paste/templates/paste/paste-meta.html:22
#: paste/templates/paste/paste-meta.html:21
msgid "None"
msgstr "Aucune"
#~ msgid "locked"
#~ msgstr "verrouillé"
#~ msgid "open"
#~ msgstr "ouvert"
#~ msgid "Password protected"
#~ msgstr "Protection par mot de passe"
#~ msgid "This paste is password protected"
#~ msgstr "Protégé par un mot de passe"
#~ msgid ""
#~ "Please enter the password in the field below to unlock the paste and "
#~ "display it"
#~ msgstr ""
#~ "Veuillez entrer le mot de passe dans le champ ci-dessous pour "
#~ "déverrouiller le collage et l'afficher"
#~ msgid "Password"
#~ msgstr "Mot de passe"
#~ msgid "Unlock"
#~ msgstr "Déverrouiller"
#~ msgid "Private"
#~ msgstr "Privé"

View File

@ -0,0 +1,34 @@
# Generated by Django 4.2 on 2023-04-21 07:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("paste", "0003_remove_paste_private"),
]
operations = [
migrations.RemoveField(
model_name="paste",
name="password",
),
migrations.RemoveField(
model_name="paste",
name="salt",
),
migrations.AlterField(
model_name="language",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
migrations.AlterField(
model_name="paste",
name="id",
field=models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
),
),
]

View File

@ -4,8 +4,6 @@ from django.utils import timezone
from datetime import datetime, timedelta
from webtools import settings
from django.utils.translation import gettext_lazy as _
import hashlib
import uuid
EXPIRE_CHOICES = (
@ -60,8 +58,6 @@ class Paste(models.Model):
lifecount = models.IntegerField(default=0, blank=True)
viewcount = models.IntegerField(default=0, editable=False)
expired = models.BooleanField(default=False, editable=False)
password = models.CharField(max_length=128, blank=True)
salt = models.CharField(max_length=36, blank=True)
def compute_size(self):
"""Computes size."""
@ -111,22 +107,6 @@ class Paste(models.Model):
return True
return False
def _hash(self, raw):
"""Return hashed string."""
if not self.salt:
self.salt = str(uuid.uuid1())
return hashlib.sha512((raw + self.salt).encode()).hexdigest()
def set_password(self, raw):
"""Define a hashed password."""
self.password = self._hash(raw)
def pwd_match(self, password):
"""Compare provided password to paste's one."""
if not password or not self._hash(password) == self.password:
return False
return True
def __unicode__(self):
"""String representation."""
return self.slug

View File

@ -24,7 +24,6 @@
<td>{% trans paste.language.name %}</td>
<td>{{ paste.size }}</td>
<td>{{ paste.paste_time }}</td>
<td>{% if paste.password %}<i class="icon-lock"> {% trans 'locked' %}</i>{% else %}<i class="icon-unlock"> {% trans 'open' %}</i>{% endif %}</td>
<td>{{ paste.viewcount }}</td>
</tr>
{% empty %}

View File

@ -59,17 +59,6 @@
</div>
{% endif %}
<div class="col-auto">
<label class="sr-only" for="id_password">{% trans 'Password protected' %}</label>
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text"><span class="add-on"><i class="icon-lock"></i></span></div>
</div>
{{ form.password|add_class:"form-control"|placeholder:'Password protected'}}
</div>
{{ form.password.errors }}
</div>
<div class="col-auto">
<button class="btn btn-primary btn-lg" type="submit">{% trans 'Paste' %}</button>
</div>

View File

@ -1,23 +0,0 @@
{% extends "base.html" %}
{% load i18n %}
{% block title %}{{ title }}{% endblock %}
{% block content %}
<h1>{{ title }}</h1>
<div id="unlock">
<p><b>{% blocktrans %}This paste is password protected{% endblocktrans %}</b>.</p>
<p>{% blocktrans %}Please enter the password in the field below to unlock the paste and display it{% endblocktrans %}.</p>
<form method="post" action="">
<div class="row">
<div class="span3">
<label for="id_password">{% trans 'Password' %}</label>
<div class="input-prepend">
<span class="add-on"><i class="icon-lock"></i></span>
<input id="id_password" maxlength="128" name="password" type="text">
</div>
</div>
</div>
{% csrf_token %}
<button type="submit" class="btn">{% trans 'Unlock' %}</button>
</form>
</div>
{% endblock %}

View File

@ -17,7 +17,6 @@
<td>{% trans paste.language.name %}</td>
<td>{{ paste.size }}</td>
<td>{{ paste.paste_time }}</td>
<td>{% if paste.password %}<i class="icon-lock"> {% trans 'locked' %}</i>{% else %}<i class="icon-unlock"> {% trans 'open' %}</i>{% endif %}</td>
<td>{{ paste.viewcount }}{% if paste.lifecount > 0 %}/{{ paste.lifecount }}{% endif %}</td>
<td>{% if paste.expiration_time %}{{ paste.expiration_time }}{% else %}{% trans 'None' %}{% endif %}</td>
</tr>

View File

@ -58,16 +58,6 @@ def show(request, slug, renderer="pygments"):
# Handling expiration
if paste.is_expired():
return render(request, "paste/expired.html")
# Handling passwords
if paste.password:
if "password" in request.POST:
password = request.POST["password"]
elif "password" in request.COOKIES:
password = request.COOKIES["password"]
else:
password = None
if not paste.pwd_match(password):
return render(request, "paste/locked.html", data)
# Before rendering actions
paste.incr_viewcount()
# Handling rendering modes
@ -76,9 +66,4 @@ def show(request, slug, renderer="pygments"):
data["current_renderer"] = renderer
data["renderers"] = settings.PASTE["enabled_renderers"]
render_method = getattr(renderers, "render_%s" % renderer)
response = render_method(request, paste, data)
# Responding
if "password" in request.POST:
response.set_cookie("password", request.POST["password"])
return response
return render_method(request, paste, data)