This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | class wkhtmltopdf { |
||
3 | protected $config; |
||
4 | protected $headers; |
||
5 | protected $cookies; |
||
6 | protected $options; |
||
7 | protected $cover; |
||
8 | |||
9 | |||
10 | public function __construct( $config = array() ) { |
||
11 | if (!$config['cmd']) { |
||
12 | $config['cmd'] = '/usr/bin/xvfb-run -a /usr/local/bin/wkhtmltopdf --disable-local-file-access '; |
||
13 | } |
||
14 | |||
15 | View Code Duplication | if (!$config['temp']) { |
|
16 | $context = pobject::getContext(); |
||
17 | $me = $context["arCurrentObject"]; |
||
18 | $config['temp'] = $me->store->get_config( "files" ) . "temp/"; |
||
19 | } |
||
20 | |||
21 | $this->config = $config; |
||
22 | $this->options = array(); |
||
23 | $this->cookies = array(); |
||
24 | $this->headers = array(); |
||
25 | $this->cover = false; |
||
26 | } |
||
27 | |||
28 | |||
29 | public function generateFromURL( $url ) { |
||
30 | if ( !preg_match( '|^https?://|', $url ) ) { |
||
31 | return ar_error::raiseError( "wkhtmltopdf: '$url' is not a valid URL", 201 ); |
||
32 | } |
||
33 | |||
34 | $url = escapeshellarg( $url ); |
||
35 | $tempFile = tempnam( $this->config['temp'], 'pdf' ); |
||
36 | if ( !$tempFile ) { |
||
37 | return ar_error::raiseError( "wkhtmltopdf: could not create a temporary file", 202 ); |
||
38 | } |
||
39 | |||
40 | $execString = $this->config['cmd']; |
||
41 | View Code Duplication | foreach ($this->options as $name => $value) { |
|
42 | if ( is_bool( $value ) ) { |
||
43 | $execString .= " --$name"; |
||
44 | } else { |
||
45 | $execString .= " --$name " . escapeshellarg( $value ); |
||
46 | } |
||
47 | } |
||
48 | |||
49 | View Code Duplication | foreach ($this->cookies as $name => $value) { |
|
50 | $execString .= " --cookie " . escapeshellarg( $name ) . " " . escapeshellarg( $value ); |
||
51 | } |
||
52 | |||
53 | View Code Duplication | foreach ($this->headers as $name => $value) { |
|
54 | $execString .= " --custom-header " . escapeshellarg( $name ) . " " . escapeshellarg( $value ); |
||
55 | } |
||
56 | |||
57 | if ($this->cover) { |
||
58 | $execString .= " cover " . escapeshellarg( $this->cover ); |
||
59 | } |
||
60 | |||
61 | $execString .= " $url $tempFile"; |
||
62 | $execOutput = array(); |
||
63 | $execResult = 0; |
||
64 | |||
65 | exec( $execString, $execOutput, $execResult ); |
||
66 | View Code Duplication | if ( $execResult != 0 && $execResult != 2 ) { // code 2 is for 404's encountered |
|
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||
67 | @unlink( $tempFile ); |
||
68 | return ar_error::raiseError( "wkhtmltopdf: error ($execResult) while trying to generate PDF: " . implode( "\n", (array) $execOutput ), 203 ); |
||
69 | } |
||
70 | |||
71 | readfile( $tempFile ); |
||
72 | unlink( $tempFile ); |
||
73 | } |
||
74 | |||
75 | public function setCookieList( $cookieList = array() ) { |
||
76 | if ( is_array($cookieList) ) { |
||
77 | foreach( $cookieList as $name => $value) { |
||
78 | $this->setOption( $name, $value ); |
||
79 | } |
||
80 | } |
||
81 | } |
||
82 | |||
83 | public function setCookie($name, $value = null) { |
||
84 | $this->cookies[ $name ] = $value; |
||
85 | } |
||
86 | |||
87 | public function setCover($url) { |
||
88 | $this->cover = $url; |
||
89 | } |
||
90 | |||
91 | public function setHeaderList( $headerList = array() ) { |
||
92 | if ( is_array($headerList) ) { |
||
93 | foreach( $headerList as $name => $value) { |
||
94 | $this->setHeader( $name, $value ); |
||
95 | } |
||
96 | } |
||
97 | } |
||
98 | |||
99 | |||
100 | public function setHeader($name, $value = null) { |
||
101 | $this->headers[ $name ] = $value; |
||
102 | } |
||
103 | |||
104 | |||
105 | public function setOptionList( $optionList = array() ) { |
||
106 | if ( is_array($optionList) ) { |
||
107 | foreach( $optionList as $name => $value) { |
||
108 | $this->setOption( $name, $value ); |
||
109 | } |
||
110 | } |
||
111 | } |
||
112 | |||
113 | public function setOption($name, $value = null) { |
||
114 | if ($value === null) { |
||
115 | unset( $this->options[ $name ] ); |
||
116 | return true; |
||
117 | } |
||
118 | switch ($name) { |
||
119 | case 'collate': |
||
120 | case 'grayscale': |
||
121 | case 'ignore-load-errors': |
||
122 | case 'lowquality': |
||
123 | case 'no-background': |
||
124 | case 'print-media-type': |
||
125 | $this->options[ $name ] = true; |
||
126 | break; |
||
127 | case 'copies': |
||
128 | case 'dpi': |
||
129 | case 'minimum-font-size': |
||
130 | case 'page-offset': |
||
131 | $this->options[ $name ] = (int) $value; |
||
132 | break; |
||
133 | case 'margin-bottom': |
||
134 | case 'margin-top': |
||
135 | case 'margin-left': |
||
136 | case 'margin-right': |
||
137 | case 'footer-center': |
||
138 | case 'footer-font-name': |
||
139 | case 'footer-font-size': |
||
140 | case 'footer-html': |
||
141 | case 'footer-line': |
||
142 | case 'footer-right': |
||
143 | case 'footer-left': |
||
144 | case 'footer-spacing': |
||
145 | case 'header-center': |
||
146 | case 'header-font-name': |
||
147 | case 'header-font-size': |
||
148 | case 'header-html': |
||
149 | case 'header-line': |
||
150 | case 'header-right': |
||
151 | case 'header-left': |
||
152 | case 'header-spacing': |
||
153 | |||
154 | case 'encoding': |
||
155 | case 'orientation': |
||
156 | case 'page-height': |
||
157 | case 'page-size': |
||
158 | case 'page-width': |
||
159 | case 'username': |
||
160 | case 'password': |
||
161 | case 'title': |
||
162 | $this->options[ $name ] = (string) $value; |
||
163 | break; |
||
164 | case 'zoom': |
||
165 | $this->options[ $name ] = (float) $value; |
||
166 | break; |
||
167 | default: |
||
168 | return false; |
||
169 | } |
||
170 | return true; |
||
171 | } |
||
172 | } |
||
173 | |||
174 | |||
175 | class pinp_wkhtmltopdf { |
||
176 | private $instance; |
||
177 | |||
178 | public function __construct( $options = array() ) { |
||
179 | $this->instance = new wkhtmltopdf(); |
||
180 | $this->instance->setOptionList( $options ); |
||
181 | } |
||
182 | |||
183 | public function _generateFromURL( $url ) { |
||
184 | return $this->instance->generateFromURL( $url ); |
||
185 | } |
||
186 | |||
187 | public static function _get( $options = array() ) { |
||
188 | return new pinp_wkhtmltopdf( $options ); |
||
189 | } |
||
190 | public function _setCover( $url ) { |
||
191 | return $this->instance->setCover( $url ); |
||
192 | } |
||
193 | } |
||
194 |