소스 검색

Merge pull request #11469 from adityahase/fix-pdf

fix(pdf): Restrict cookies to the host domain
version-14
mergify[bot] 4 년 전
committed by GitHub
부모
커밋
ebcc23591a
No known key found for this signature in database GPG 키 ID: 4AEE18F83AFDEB23
1개의 변경된 파일21개의 추가작업 그리고 7개의 파일을 삭제
  1. +21
    -7
      frappe/utils/pdf.py

+ 21
- 7
frappe/utils/pdf.py 파일 보기

@@ -52,6 +52,8 @@ def get_pdf(html, options=None, output=None):
output.appendPagesFromReader(reader) output.appendPagesFromReader(reader)
else: else:
raise raise
finally:
cleanup(options)


if "password" in options: if "password" in options:
password = options["password"] password = options["password"]
@@ -110,8 +112,7 @@ def prepare_options(html, options):
options.update(html_options or {}) options.update(html_options or {})


# cookies # cookies
if frappe.session and frappe.session.sid:
options['cookie'] = [('sid', '{0}'.format(frappe.session.sid))]
options.update(get_cookie_options())


# page size # page size
if not options.get("page-size"): if not options.get("page-size"):
@@ -120,6 +121,22 @@ def prepare_options(html, options):
return html, options return html, options




def get_cookie_options():
options = {}
if frappe.session and frappe.session.sid:
# Use wkhtmltopdf's cookie-jar feature to set cookies and restrict them to host domain
cookiejar = "/tmp/{}.jar".format(frappe.generate_hash())

# Remove port from request.host
# https://werkzeug.palletsprojects.com/en/0.16.x/wrappers/#werkzeug.wrappers.BaseRequest.host
domain = frappe.local.request.host.split(":", 1)[0]
with open(cookiejar, "w") as f:
f.write("sid={}; Domain={};\n".format(frappe.session.sid, domain))

options['cookie-jar'] = cookiejar

return options

def read_options_from_html(html): def read_options_from_html(html):
options = {} options = {}
soup = BeautifulSoup(html, "html5lib") soup = BeautifulSoup(html, "html5lib")
@@ -184,11 +201,8 @@ def prepare_header_footer(soup):
return options return options




def cleanup(fname, options):
if os.path.exists(fname):
os.remove(fname)

for key in ("header-html", "footer-html"):
def cleanup(options):
for key in ("header-html", "footer-html", "cookie-jar"):
if options.get(key) and os.path.exists(options[key]): if options.get(key) and os.path.exists(options[key]):
os.remove(options[key]) os.remove(options[key])




불러오는 중...
취소
저장