Wiki-Quellcode von PDFViewerService

Zuletzt geändert von Team green-solutions am 2025/05/19 11:42

Zeige letzte Bearbeiter
1 {{groovy}}
2 import org.xwiki.security.authorization.Right
3 import javax.servlet.ServletOutputStream
4 import org.apache.commons.io.IOUtils;
5 import org.xwiki.crypto.DigestFactory;
6 import org.xwiki.crypto.BinaryStringEncoder;
7
8 def reference = request.get('reference')
9 def filename = request.get('filename')
10 def user = request.get('user')
11 def key = request.get('key')
12
13 if (!reference || !filename || !user || !key)
14 return;
15
16 def userRef = services.model.resolveDocument(user)
17 def pdfDocRef = services.model.resolveDocument(reference)
18
19 if(services.security.authorization.hasAccess(Right.VIEW, userRef, pdfDocRef)) {
20 // Changing the context user
21 def currentUserRef = xcontext.context.getUserReference()
22 xcontext.context.setUserReference(userRef)
23 try {
24 // Getting the document
25 def pdfXDoc = xwiki.getDocument(pdfDocRef)
26 def attachment = pdfXDoc.getAttachment(filename)
27 def digestFactory = services.component.getInstance(DigestFactory.class, 'SHA-1')
28 def encoder = services.component.getInstance(BinaryStringEncoder.class, 'URLBase64')
29 def digest = digestFactory.instance
30 def is = digest.getInputStream(attachment.contentInputStream)
31 is.skip(1000)
32 is.close()
33 if (currentUserRef) {
34 digest.update(services.model.serialize(currentUserRef, 'default').getBytes('UTF-8'))
35 }
36 digest.update(services.model.serialize(userRef, 'default').getBytes('UTF-8'))
37 def check = encoder.encode(digest.digest)
38 if(key.equals(check)) {
39 // Adding the PDF content in the response
40 response.setContentType("application/pdf")
41 IOUtils.copyLarge(pdfXDoc.getAttachment(filename).getContentInputStream(), response.getOutputStream())
42 }
43 } finally {
44 // Changing back the context user
45 xcontext.context.setUserReference(currentUserRef)
46 }
47 }
48 {{/groovy}}