Skip to content

Commit a28c971

Browse files
committed
accept/reject key + mail notification
1 parent b28f732 commit a28c971

File tree

9 files changed

+85
-1
lines changed

9 files changed

+85
-1
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ db.sqlite3
1717
media
1818
.vs
1919
node_modules
20+
dovenv2

dovenv2.bat

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
call ..\venvs\etsdenv\scripts\activate
2+
set DJANGO_SETTINGS_MODULE=etsd.settings.dev

etsd/keys/tables.py

+1
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ class Meta:
2424
"confirmation_document",
2525
"created_on",
2626
"created_by",
27+
"approved_on",
2728
)
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{% block content %} {% endblock %}
2+
For more info login to the Electronic Transmission of Sensitive Data app.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{% extends 'keys/emails/base.txt' %}
2+
{% block content %}
3+
Your pending Public Key's status with fingerprint: {{ fingerprint }} has been changed to {{ status }} by an administrator.
4+
{% endblock %}

etsd/keys/templates/keys/publickey_detail.html

+31
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,30 @@
99
{% block page_content %}
1010

1111
<div class="row">
12+
<!-- Modal -->
13+
<div class="modal fade" id="confirmModal" tabindex="-1" role="dialog" aria-labelledby="confirmModalLabel" aria-hidden="true">
14+
<div class="modal-dialog" role="document">
15+
<div class="modal-content">
16+
<div class="modal-header">
17+
<h5 class="modal-title" id="confirmModalLabel">Public Key Confirmation</h5>
18+
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
19+
<span aria-hidden="true">&times;</span>
20+
</button>
21+
</div>
22+
<div class="modal-body">
23+
Do you want to Accept or Reject this public key?
24+
</div>
25+
<div class="modal-footer">
26+
<form method="POST">
27+
{% csrf_token %}
28+
<button id='acceptButton' type="submit" name="acceptKey" class='btn btn-primary' >{% translate "Accept" %}</button>
29+
<button id='rejectButton' type="submit" name="rejectKey" class='btn btn-warning'>{% translate "Reject" %}</button>
30+
</form>
31+
<button type="button" class="btn btn-secondary" data-dismiss="modal">{% translate "Cancel" %}</button>
32+
</div>
33+
</div>
34+
</div>
35+
</div>
1236
<div class="col-md-6">
1337
<b>{% translate "ID" %}</b>: {{ publickey.id }}<br />
1438
<b>{% translate "Authority" %}</b>: {{ publickey.authority }}<br />
@@ -20,6 +44,10 @@
2044
<div class="alert alert-warning">
2145
The public key needs confirmation by the administration in order to be used.
2246
</div>
47+
{% if perms.core.admin %}
48+
<!-- Button trigger modal -->
49+
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#confirmModal">{% translate "Confirmation" %}</button>
50+
{% endif %}
2351
{% endif %}
2452

2553

@@ -44,6 +72,9 @@ <h5>Key text</h5>
4472

4573
{% block extra_script %}
4674
<script src='{% static "openpgp/openpgp.min.js" %}'></script>
75+
<script src='{% static "jquery-3.5.1.min.js" %}'></script>
76+
<script src='{% static "modal/popper.min.js" %}'></script>
77+
<script src='{% static "modal/bootstrap.min.js" %}'></script>
4778
<script>
4879

4980
const loadPK = (async(key_data) => {

etsd/keys/views.py

+32-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
from django_tables2 import RequestConfig
55
from django.urls import reverse
66
from django.utils.translation import ugettext as _
7-
7+
from datetime import datetime
8+
from django.template.loader import get_template
9+
from django.core.mail import send_mail
10+
from .. import users
811
from django_tables2.export.views import ExportMixin
912

1013
from . import models, tables, filters, forms
@@ -44,6 +47,34 @@ def get_context_data(self, *args, **kwargs):
4447
class PublicKeyDetailView(AdminOrAuthorityQsMixin, DetailView):
4548
model = models.PublicKey
4649

50+
def post(self, request, *args, **kwargs):
51+
pubk= models.PublicKey.objects.get(pk=self.kwargs.get('pk'))
52+
53+
if "acceptKey" in request.POST:
54+
activekeys = models.PublicKey.objects.filter(authority=pubk.authority, status="ACTIVE")
55+
for key in activekeys:
56+
key.status = "INACTIVE"
57+
key.save()
58+
pubk.approved_on = datetime.now()
59+
pubk.status = "ACTIVE"
60+
if "rejectKey" in request.POST:
61+
pubk.status = "REJECTED"
62+
63+
email_template = get_template("keys/emails/confirmation.txt")
64+
email_ctx = dict(fingerprint=pubk.fingerprint, status = pubk.status,)
65+
email_body = email_template.render(email_ctx)
66+
usrs = users.models.User.objects.all()
67+
recip_list = [usr.email for usr in usrs if usr.get_authority()==pubk.authority]
68+
send_mail(
69+
subject="Public Key Confirmation",
70+
message=email_body,
71+
from_email="[email protected]",
72+
recipient_list= recip_list,
73+
fail_silently= False
74+
)
75+
pubk.save()
76+
return HttpResponseRedirect(self.request.path_info)
77+
4778

4879
class PublicKeyCreateView(CreateView):
4980
model = models.PublicKey

static/modal/bootstrap.min.js

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

static/modal/popper.min.js

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)