Skip to content

Commit 78047e0

Browse files
NyanHelsingcslzchen
authored andcommitted
Fix a bug that single quote in file names breaks docx
[skip ci]
1 parent 0e33dcb commit 78047e0

File tree

2 files changed

+64
-6
lines changed

2 files changed

+64
-6
lines changed

mfr/extensions/pdf/render.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import logging
22
import os
3+
import re
34

45
import furl
56
from mako.lookup import TemplateLookup
@@ -20,10 +21,14 @@ class PdfRenderer(extension.BaseRenderer):
2021

2122
def render(self):
2223
download_url = munge_url_for_localdev(self.metadata.download_url)
23-
logger.debug('extension::{} supported-list::{}'.format(self.metadata.ext, settings.EXPORT_SUPPORTED))
24+
logger.debug('extension::{} supported-list::{}'.format(self.metadata.ext,
25+
settings.EXPORT_SUPPORTED))
2426
if self.metadata.ext not in settings.EXPORT_SUPPORTED:
2527
logger.debug('Extension not found in supported list!')
26-
return self.TEMPLATE.render(base=self.assets_url, url=download_url.geturl())
28+
return self.TEMPLATE.render(
29+
base=self.assets_url,
30+
url=re.sub(r'\'', '\\\'', download_url.geturl())
31+
)
2732

2833
logger.debug('Extension found in supported list!')
2934
exported_url = furl.furl(self.export_url)

tests/extensions/pdf/test_renderer.py

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import furl
22
import pytest
3+
import re
34

45
from mfr.extensions.pdf import (settings,
56
PdfRenderer)
@@ -16,6 +17,16 @@ def tif_metadata():
1617
return ProviderMetadata('test', '.tif', 'text/plain', '1234',
1718
'http://wb.osf.io/file/test.tif?token=1234')
1819

20+
@pytest.fixture
21+
def docx_metadata():
22+
return ProviderMetadata(
23+
'te\'st',
24+
'.docx',
25+
'text/plain',
26+
'1234',
27+
'http://mfr.osf.io/export?url=http://osf.io/file/te\'st.pdf'
28+
)
29+
1930
@pytest.fixture
2031
def file_path():
2132
return '/tmp/test.pdf'
@@ -24,15 +35,24 @@ def file_path():
2435
def tif_file_path():
2536
return '/tmp/test.tif'
2637

38+
@pytest.fixture
39+
def docx_file_path():
40+
return '/tmp/te\'st.docx'
41+
2742

2843
@pytest.fixture
2944
def url():
30-
return 'http://osf.io/file/test.pdf'
45+
return 'http://osf.io/file/te\'st.pdf'
3146

3247

3348
@pytest.fixture
3449
def tif_url():
35-
return 'http://osf.io/file/test.tif'
50+
return 'http://osf.io/file/te\'st.tif'
51+
52+
53+
@pytest.fixture
54+
def docx_url():
55+
return 'http://osf.io/file/te\'st.tif'
3656

3757

3858
@pytest.fixture
@@ -42,18 +62,42 @@ def assets_url():
4262

4363
@pytest.fixture
4464
def export_url():
45-
return 'http://mfr.osf.io/export?url=' + url()
65+
return 'http://mfr.osf.io/export?url=http://osf.io/file/te\'st.pdf'
4666

4767

4868
@pytest.fixture
4969
def renderer(metadata, file_path, url, assets_url, export_url):
5070
return PdfRenderer(metadata, file_path, url, assets_url, export_url)
5171

72+
5273
@pytest.fixture
53-
def tif_renderer(tif_metadata, tif_file_path, tif_url, assets_url, export_url):
74+
def tif_renderer(
75+
tif_metadata,
76+
tif_file_path,
77+
tif_url,
78+
assets_url,
79+
export_url
80+
):
5481
return PdfRenderer(tif_metadata, tif_file_path, tif_url, assets_url, export_url)
5582

5683

84+
@pytest.fixture
85+
def docx_renderer(
86+
docx_metadata,
87+
docx_file_path,
88+
docx_url,
89+
assets_url,
90+
export_url
91+
):
92+
return PdfRenderer(
93+
docx_metadata,
94+
docx_file_path,
95+
docx_url,
96+
assets_url,
97+
export_url
98+
)
99+
100+
57101
class TestPdfRenderer:
58102

59103
def test_render_pdf(self, renderer, metadata, assets_url):
@@ -71,3 +115,12 @@ def test_render_tif(self, tif_renderer, assets_url):
71115
assert '<base href="{}/{}/web/" target="_blank">'.format(assets_url, 'pdf') in body
72116
assert '<div id="viewer" class="pdfViewer"></div>' in body
73117
assert 'DEFAULT_URL = \'{}\''.format(exported_url.url) in body
118+
119+
def test_render_docx(self, docx_renderer, assets_url):
120+
exported_url = furl.furl(docx_renderer.export_url)
121+
122+
body = docx_renderer.render()
123+
assert '<base href="{}/{}/web/" target="_blank">'.format(assets_url, 'pdf') in body
124+
assert '<div id="viewer" class="pdfViewer"></div>' in body
125+
assert 'DEFAULT_URL = \'{}\''.format(re.sub(r'\'', '\\\'', exported_url.url)) in body
126+

0 commit comments

Comments
 (0)