1515use HTMLPurifier_URI ;
1616use HTMLPurifier_URIFilter ;
1717use HTMLPurifier_URIParser ;
18+ use OCA \Mail \Html \ProxyHmacGenerator ;
1819use OCP \IRequest ;
1920use OCP \IURLGenerator ;
2021
@@ -33,17 +34,20 @@ class TransformURLScheme extends HTMLPurifier_URIFilter {
3334 */
3435 private $ mapCidToAttachmentId ;
3536
36- /** @var array */
37- private $ messageParameters ;
37+ private int $ id ;
3838
39- public function __construct (array $ messageParameters ,
39+ private ProxyHmacGenerator $ hmacGenerator ;
40+
41+ public function __construct (int $ id ,
4042 Closure $ mapCidToAttachmentId ,
4143 IURLGenerator $ urlGenerator ,
42- IRequest $ request ) {
43- $ this ->messageParameters = $ messageParameters ;
44+ IRequest $ request ,
45+ ProxyHmacGenerator $ hmacGenerator ) {
46+ $ this ->id = $ id ;
4447 $ this ->mapCidToAttachmentId = $ mapCidToAttachmentId ;
4548 $ this ->urlGenerator = $ urlGenerator ;
4649 $ this ->request = $ request ;
50+ $ this ->hmacGenerator = $ hmacGenerator ;
4751 }
4852
4953 /**
@@ -56,7 +60,6 @@ public function __construct(array $messageParameters,
5660 */
5761 #[\Override]
5862 public function filter (&$ uri , $ config , $ context ) {
59-
6063 if ($ uri ->scheme === null ) {
6164 $ uri ->scheme = 'https ' ;
6265 }
@@ -71,10 +74,14 @@ public function filter(&$uri, $config, $context) {
7174 if (is_null ($ attachmentId )) {
7275 return true ;
7376 }
74- $ this ->messageParameters ['attachmentId ' ] = $ attachmentId ;
7577
76- $ imgUrl = $ this ->urlGenerator ->linkToRouteAbsolute ('mail.messages.downloadAttachment ' ,
77- $ this ->messageParameters );
78+ $ imgUrl = $ this ->urlGenerator ->linkToRouteAbsolute (
79+ 'mail.messages.downloadAttachment ' ,
80+ [
81+ 'id ' => $ this ->id ,
82+ 'attachmentId ' => $ attachmentId ,
83+ ],
84+ );
7885 $ parser = new HTMLPurifier_URIParser ();
7986 $ uri = $ parser ->parse ($ imgUrl );
8087 }
@@ -88,23 +95,23 @@ public function filter(&$uri, $config, $context) {
8895 * @return HTMLPurifier_URI
8996 */
9097 private function filterHttpFtp (&$ uri , $ context ) {
91- $ originalURL = urlencode ( $ uri ->scheme . ':// ' . $ uri ->host ) ;
98+ $ originalURL = $ uri ->scheme . ':// ' . $ uri ->host ;
9299
93100 // Add the port if it's not a default port
94101 if ($ uri ->port !== null
95102 && !($ uri ->scheme === 'http ' && $ uri ->port === 80 )
96103 && !($ uri ->scheme === 'https ' && $ uri ->port === 443 )
97104 && !($ uri ->scheme === 'ftp ' && $ uri ->port === 21 )) {
98- $ originalURL = $ originalURL . urlencode ( ': ' . $ uri ->port ) ;
105+ $ originalURL = $ originalURL . ': ' . $ uri ->port ;
99106 }
100107
101- $ originalURL = $ originalURL . urlencode ( $ uri ->path ) ;
108+ $ originalURL = $ originalURL . $ uri ->path ;
102109
103110 if ($ uri ->query !== null ) {
104- $ originalURL = $ originalURL . urlencode ( '? ' . $ uri ->query ) ;
111+ $ originalURL = $ originalURL . '? ' . $ uri ->query ;
105112 }
106113 if ($ uri ->fragment !== null ) {
107- $ originalURL = $ originalURL . urlencode ( '# ' . $ uri ->fragment ) ;
114+ $ originalURL = $ originalURL . '# ' . $ uri ->fragment ;
108115 }
109116
110117 // Get the HTML attribute
@@ -116,12 +123,19 @@ private function filterHttpFtp(&$uri, $context) {
116123 return $ uri ;
117124 }
118125
126+ $ proxyUrl = $ this ->urlGenerator ->linkToRoute ('mail.proxy.proxy ' , [
127+ 'id ' => $ this ->id ,
128+ 'hmac ' => $ this ->hmacGenerator ->generate ($ this ->id , $ originalURL ),
129+ 'src ' => $ originalURL
130+ ]);
131+ $ parsedProxyUrl = parse_url ($ proxyUrl );
132+ /** @var array{path: string, query: string} $parsedProxyUrl */
119133 return new \HTMLPurifier_URI (
120134 $ this ->request ->getServerProtocol (),
121135 null , $ this ->request ->getServerHost (),
122136 null ,
123- $ this -> urlGenerator -> linkToRoute ( ' mail.proxy.proxy ' ) ,
124- ' src= ' . $ originalURL . ' &requesttoken= ' . \ OCP \Server:: get (\ OCP \ISession::class)-> get ( ' requesttoken ' ) ,
137+ $ parsedProxyUrl [ ' path ' ] ,
138+ $ parsedProxyUrl [ ' query ' ] ,
125139 null
126140 );
127141 }
0 commit comments