Skip to content

Commit ce1b0fe

Browse files
authored
Merge pull request #166 from Xpirix/block-replace-plugin-version
Block replace approved plugin version
2 parents 1a72ae9 + eb29a9a commit ce1b0fe

File tree

6 files changed

+85
-17
lines changed

6 files changed

+85
-17
lines changed

qgis-app/plugins/templates/plugins/plugin_detail.html

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,18 @@ <h2>
577577
{% endif %}
578578
</a>
579579
{% if user.is_staff or user in version.plugin.editors %}
580-
<a class="button is-success is-small is-outlined" href="{% url "version_update" object.package_name version.version %}" title="{% trans "Edit" %}"><i class="fas fa-pencil"></i></a>
580+
{% if not version.approved %}
581+
<a
582+
class="button is-success is-small is-outlined"
583+
href="{% url "version_update" object.package_name version.version %}"
584+
title="{% trans "Edit" %}">
585+
<i class="fas fa-pencil"></i>
586+
</a>
587+
{% else %}
588+
<button class="button is-success is-small is-outlined" disabled title="{% trans 'Cannot edit approved version' %}">
589+
<i class="fas fa-pencil"></i>
590+
</button>
591+
{% endif %}
581592
<a class="button is-danger is-small is-outlined" href="{% url "version_delete" object.package_name version.version %}" title="{% trans "Delete" %}"><i class="fas fa-remove"></i></a>
582593
{% endif %}
583594
</form>
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
{% extends 'plugins/plugin_base.html' %}{% load i18n %}
22
{% block content %}
3-
<div class="error">{% trans "You cannot create or modify versions of this plugin." %}</div>
3+
<div class="notification is-danger is-light">
4+
<strong>{% trans "Permission Denied" %}</strong><br>
5+
{% trans "You cannot create or modify versions of this plugin." %}
6+
</div>
47
{% endblock %}

qgis-app/plugins/tests/test_plugin_update.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,10 @@ def test_plugin_version_update(self):
136136
})
137137
self.assertEqual(response.status_code, 302)
138138

139-
# The old version should not exist anymore
140-
# TODO: The old version still exist, not sure why
141-
# self.assertFalse(PluginVersion.objects.filter(
142-
# plugin__name='Test Plugin',
143-
# version='0.0.1').exists()
144-
# )
139+
self.assertFalse(PluginVersion.objects.filter(
140+
plugin__name='Test Plugin',
141+
version='0.0.1').exists()
142+
)
145143
self.assertTrue(PluginVersion.objects.filter(
146144
plugin__name='Test Plugin',
147145
version='0.0.2').exists()
@@ -172,6 +170,21 @@ def test_plugin_version_update(self):
172170
settings.EMAIL_HOST_USER
173171
)
174172

173+
def test_plugin_version_approved_update(self):
174+
"""
175+
Test update a plugin version that is already approved
176+
"""
177+
package_name = self.plugin.package_name
178+
self.url_add_version = reverse('version_update', args=[package_name, '0.0.1'])
179+
version = PluginVersion.objects.get(plugin__name='Test Plugin', version='0.0.1')
180+
version.approved = True
181+
version.save()
182+
self.assertTrue(version.approved)
183+
184+
response = self.client.get(self.url_add_version)
185+
# Should redirect to the plugin details page
186+
self.assertEqual(response.status_code, 302)
187+
self.assertRedirects(response, reverse('plugin_detail', args=[package_name]))
175188

176189
def tearDown(self):
177190
self.client.logout()

qgis-app/plugins/tests/test_token_auth.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,38 @@ def test_update_version_with_valid_token(self):
135135
'package': uploaded_file,
136136
})
137137
self.assertEqual(response.status_code, 302)
138-
# This will create a new version because this one is using token and doesn't have a created_by column
139-
self.assertTrue(PluginVersion.objects.filter(plugin__name='Test Plugin', version='0.0.1').exists())
138+
self.assertFalse(PluginVersion.objects.filter(plugin__name='Test Plugin', version='0.0.1').exists())
140139
self.assertTrue(PluginVersion.objects.filter(plugin__name='Test Plugin', version='0.0.2').exists())
141140

141+
def test_update_approved_version_with_token(self):
142+
# Generate a token for the authenticated user
143+
self.client.post(self.url_token_create, {})
144+
outstanding_token = OutstandingToken.objects.last().token
145+
refresh = RefreshToken(outstanding_token)
146+
refresh['plugin_id'] = self.plugin.pk
147+
refresh['refresh_jti'] = refresh['jti']
148+
access_token = str(refresh.access_token)
149+
150+
version = PluginVersion.objects.get(plugin__name='Test Plugin', version='0.0.1')
151+
version.approved = True
152+
version.save()
153+
self.assertTrue(version.approved)
154+
155+
# Log out the user and use the token
156+
self.client.logout()
157+
158+
c = Client(HTTP_AUTHORIZATION=f"Bearer {access_token}")
159+
160+
# Test request with access token
161+
response = c.get(self.url_update_version)
162+
# Check that the response is forbidden
163+
self.assertEqual(response.status_code, 401)
164+
self.assertIn("application/json", response["Content-Type"])
165+
self.assertEqual(
166+
response.json().get("detail"),
167+
"You cannot edit an approved version, please create a new version instead."
168+
)
169+
142170
def test_update_version_with_invalid_token(self):
143171
# Log out the user and use the token
144172
self.client.logout()

qgis-app/plugins/views.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,14 @@ def version_update_api(request, package_name, version):
13271327
disabling CSRF protection.
13281328
"""
13291329
plugin = get_object_or_404(Plugin, package_name=package_name)
1330-
version = PluginVersion(plugin=plugin, is_from_token=True, token=request.plugin_token)
1330+
version = get_object_or_404(PluginVersion, plugin=plugin, version=version)
1331+
if version.approved:
1332+
msg = _(
1333+
"You cannot edit an approved version, please create a new version instead."
1334+
)
1335+
return JsonResponse({"detail": msg}, status=401)
1336+
version.is_from_token = True
1337+
version.token = request.plugin_token
13311338
return _version_update(request, plugin, version)
13321339

13331340

@@ -1339,6 +1346,12 @@ def version_update(request, package_name, version):
13391346
return render(
13401347
request, "plugins/version_permission_deny.html", {"plugin": plugin}
13411348
)
1349+
if version.approved:
1350+
msg = _(
1351+
"You cannot edit an approved version, please create a new version instead."
1352+
)
1353+
messages.error(request, msg, fail_silently=True, extra_tags="is-danger")
1354+
return HttpResponseRedirect(plugin.get_absolute_url())
13421355
version.created_by = request.user
13431356
is_trusted=request.user.has_perm("plugins.can_approve")
13441357
return _version_update(request, plugin, version, is_trusted=is_trusted)

qgis-app/templates/base.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@
6262
</div>
6363
<div class="content column is-9">
6464
{% if messages %}
65-
<div class="notification is-light">
66-
<button class="delete"></button>
67-
{% for message in messages %}
68-
<p{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message|safe }}</p>
69-
{% endfor %}
70-
</div>
65+
{% for message in messages %}
66+
<div class="notification is-light {% if message.tags %} {{ message.tags }}{% endif %}">
67+
<button class="delete"></button>
68+
{{ message|safe }}
69+
</div>
70+
{% endfor %}
7171
{% endif %}
7272
{% block content %}
7373
{% endblock %}

0 commit comments

Comments
 (0)