Projet

Général

Profil

0001-pwa-allow-absolute-redirection-url-from-internal-pag.patch

Nicolas Roche, 16 septembre 2021 12:22

Télécharger (4,68 ko)

Voir les différences:

Subject: [PATCH] pwa: allow absolute redirection url from internal page
 (#56974)

 .../pwa/templates/combo/pwa/navigation.html   |  4 +-
 tests/test_pwa.py                             | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 2 deletions(-)
combo/apps/pwa/templates/combo/pwa/navigation.html
2 2
<div class="pwa-navigation" id="pwa-navigation"
3 3
  {% if include_user_name %}data-pwa-user-name="{% skeleton_extra_placeholder user-name %}{{user.get_full_name}}{% end_skeleton_extra_placeholder %}"{% endif %}>
4 4
<div>
5 5
<ul>
6 6
  {% for entry in entries %}
7 7
  <li class="{{ entry.css_class_names }}{% if entry.link_page in page.get_parents_and_self  %} selected{% endif %}" data-entry-pk="{{ entry.pk }}"
8 8
      {% if entry.notification_count %}data-notification-count-url="{{site_base}}/api/notification/count/"{% endif %}
9 9
      {% if entry.use_user_name_as_label %}data-include-user-name{% endif %}>
10
      <a href="{% if entry.link_page_id %}{{ site_base }}{% endif %}{{ entry.get_url }}"
10
      <a href="{% if entry.link_page_id and entry.get_url|slice:":4" != "http"%}{{ site_base }}{% endif %}{{ entry.get_url }}"
11 11
         {% if entry.icon %}style="background-image: url({{site_base}}{{entry.icon.url}});"{% endif %}
12 12
         ><span>{{ entry.get_label }}</span></a></li>
13 13
  {% endfor %}
14 14
</ul>
15 15
</div>
16 16
</div>
17 17
<script>
18 18
$('li[data-include-user-name]').each(function(idx, elem) {
......
31 31
    crossDomain: true,
32 32
    success: function(data) {
33 33
      if (data.new) {
34 34
        $entry.find('span').append(' <span class="badge">' + data.new + '</span>');
35 35
      }
36 36
  }});
37 37
});
38 38
</script>
39
{% endif %}
39
{% endif %}
tests/test_pwa.py
1 1
import base64
2 2
from unittest import mock
3
from html.parser import HTMLParser
3 4

  
4 5
import pytest
5 6
from django.conf import settings
6 7
from django.core.files import File
7 8
from django.template import Context, Template
8 9
from django.test import override_settings
9 10
from django.test.client import RequestFactory
10 11
from django.urls import reverse
......
248 249
        assert nav.count('background-image') == 1
249 250
        assert nav.count('data-notification-count-url=') == 1
250 251
        assert nav.count('data-pwa-user-name=""') == 1
251 252

  
252 253
        nav = t.render(Context({'request': request, 'render_skeleton': True}))
253 254
        assert 'data-pwa-user-name="{% block placeholder-user-name %}' in nav
254 255

  
255 256

  
257
def test_pwa_navigation_templatetag_internal_redirection(app):
258
    page1 = Page(title='One', slug='one')
259
    page2 = Page(title='Two', slug='two', redirect_url = 'https://www.example.org/test')
260
    page3 = Page(title='Three', slug='three', redirect_url = '../test')
261
    page4 = Page(title='Four', slug='four', redirect_url = '{{test_url}}plop')
262
    page1.save()
263
    page2.save()
264
    page3.save()
265
    page4.save()
266
    entry1 = PwaNavigationEntry(link_page=page1, order=1)
267
    entry2 = PwaNavigationEntry(link_page=page2, order=2)
268
    entry3 = PwaNavigationEntry(link_page=page3, order=3)
269
    entry4 = PwaNavigationEntry(link_page=page4, order=4)
270
    entry1.save()
271
    entry2.save()
272
    entry3.save()
273
    entry4.save()
274
    t = Template('{% load pwa %}{% pwa_navigation %}')
275
    assert t.render(Context({})) == ''
276

  
277
    with override_settings(TEMPLATE_VARS={'pwa_display': 'standalone'}):
278
        request = RequestFactory().get('/')
279
        nav = t.render(Context({'request': request}))
280

  
281
    class MyHTMLParser(HTMLParser):
282
        def handle_starttag(self, tag, attrs):
283
            if tag == 'a':
284
                results.append(attrs[0][1])
285

  
286
    parser = MyHTMLParser()
287
    results = []
288
    parser.feed(nav)
289
    assert results == [
290
        'http://testserver/one/',
291
        'https://www.example.org/test',
292
        'http://testserver/three/',
293
        'http://testserver/four/',
294
    ]
295

  
296

  
256 297
def test_pwa_application_icon(app, admin_user):
257 298
    app = login(app)
258 299
    with override_settings(TEMPLATE_VARS={'pwa_display': 'standalone'}):
259 300
        PwaSettings.objects.all().delete()
260 301
        resp = app.get('/manage/pwa/')
261 302
        resp.form['application_icon'] = Upload(
262 303
            'test.png',
263 304
            base64.decodebytes(
264
-