PluginProbe
VdoCipher: Secure Video Player and Hosting / 1.9
VdoCipher: Secure Video Player and Hosting v1.9
trunk 1.10 1.11 1.12 1.13 1.14 1.15 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.3 1.30 1.4 1.5 1.6 All 28 releases
← All changes | vdocipher.php +97 -353 1.271.9 View file →
@@ -1,74 +1,38 @@
1 1 <?php
2 2 /**
3 3 * Plugin Name: VdoCipher
4 - * Plugin URI: https://www.vdocipher.com
5 - * Description: Secured video hosting for WordPress
6 - * Version: 1.27
4 + * Plugin URI: http://www.vdocipher.com
5 + * Description: Secured video hosting for wordpress
6 + * Version: 1.9
7 7 * Author: VdoCipher
8 - * Author URI: https://www.vdocipher.com
8 + * Author URI: http://www.vdocipher.com
9 9 * License: GPL2
10 10 */
11 11
12 +error_reporting(E_ALL);
13 +ini_set('display_errors', 1);
14 +
12 15 if (__FILE__ == $_SERVER['SCRIPT_FILENAME']) {
13 16 header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
14 - exit("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html lang='en'><head>\r\n<title>404 Not Found</title>\r\n".
17 + exit("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head>\r\n<title>404 Not Found</title>\r\n".
15 18 "</head><body>\r\n<h1>Not Found</h1>\r\n<p>The requested URL " . $_SERVER['SCRIPT_NAME'] . " was not found on ".
16 19 "this server.</p>\r\n</body></html>");
17 20 }
18 21
19 -if (!defined('VDOCIPHER_PLUGIN_VERSION')) {
20 - define('VDOCIPHER_PLUGIN_VERSION', '1.27');
21 -}
22 -
23 -if (!defined('VDOCIPHER_PLAYER_VERSION')) {
24 - define('VDOCIPHER_PLAYER_VERSION', '1.6.10');
25 -}
26 -
27 -if (!defined('VDOCIPHER_DEFAULT_THEME')) {
28 - define('VDOCIPHER_DEFAULT_THEME', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
29 -}
30 -
31 -function vdo_plugin_check_version()
22 +function vdo_send($action, $params, $posts = array())
32 23 {
33 - // This applies only for installs 1.24 and below
34 - if (!get_option('vdo_plugin_version')) {
35 - if (preg_match('/^1\.[0123456]\.[0-9]{1,2}$/', get_option('vdo_embed_version'))) {
36 - update_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
37 - }
38 - if (preg_match('/^1\.[01234]\.[0-9]{1,2}$/', get_option('vdo_embed_version'))) {
39 - update_option('vdo_default_height', 'auto');
40 - }
41 - update_option('vdo_plugin_version', VDOCIPHER_PLUGIN_VERSION);
42 - return ;
43 - }
44 - // This applies for all new installations after 1.25
45 - if (VDOCIPHER_PLUGIN_VERSION !== get_option('vdo_plugin_version')) {
46 - if (preg_match('/^1\.[0-9]{1,2}\.[0-9]{1,2}$/', get_option('vdo_embed_version'))) {
47 - update_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
48 - }
49 - update_option('vdo_plugin_version', VDOCIPHER_PLUGIN_VERSION);
50 - }
51 -}
52 -
53 -add_action('plugins_loaded', 'vdo_plugin_check_version');
54 -
55 -// Function called to retrieve id for when title given, starts
56 -function vdo_retrieve_id($title)
57 -{
58 24 $client_key = get_option('vdo_client_key');
59 25 if ($client_key == false || $client_key == "") {
60 - return "Plugin not configured. Please set the API key to embed videos.";
26 + return "Plugin not configured. Please set the key to embed videos.";
61 27 }
62 - $url = "https://dev.vdocipher.com/api/videos?q=$title";
63 - $headers = array(
64 - 'Authorization'=>'Apisecret '.$client_key,
65 - 'Content-Type'=>'application/json',
66 - 'Accept'=>'application/json'
67 - );
68 - $response = wp_remote_post($url, array(
69 - 'method' => 'GET',
70 - 'headers' => $headers
28 +
29 + $getData = http_build_query($params);
30 + $posts["clientSecretKey"] = $client_key;
31 + $url = "http://api.vdocipher.com/v2/$action/?$getData";
32 + $response = wp_safe_remote_post($url, array(
33 + 'method' => 'POST',
34 + 'body' => $posts
71 35 ));
72 36 if (is_wp_error($response)) {
73 37 $error_message = $response->get_error_message();
74 38 echo "VdoCipher: Something went wrong: $error_message";
@@ -73,96 +37,52 @@
73 37 $error_message = $response->get_error_message();
74 38 echo "VdoCipher: Something went wrong: $error_message";
75 39 return "";
76 40 }
77 - $video_json_response = $response['body'];
78 - $video_list_object = json_decode($video_json_response);
79 - $video_list = $video_list_object->rows;
80 - $video_object = $video_list[0];
81 - return $video_object->id;
41 + return $response['body'];
82 42 }
83 -// Function called to retrieve id for when title given, ends
84 -
85 -// Function called to get OTP, starts
86 -function vdo_otp($video, $otp_post_array = array())
87 -{
88 - $client_key = get_option('vdo_client_key');
89 - if ($client_key == false || $client_key == "") {
90 - return "Plugin not configured. Please set the API key to embed videos.";
91 - }
92 - $url = "https://dev.vdocipher.com/api/videos/$video/otp";
93 - $headers = array(
94 - 'Authorization'=>'Apisecret '.$client_key,
95 - 'Content-Type'=>'application/json',
96 - 'Accept'=>'application/json'
97 - );
98 - $otp_post_json = json_encode($otp_post_array);
99 - $response = wp_remote_post(
100 - $url,
101 - array(
102 - 'method' => 'POST',
103 - 'headers' => $headers,
104 - 'body' => $otp_post_json
105 - )
106 - );
107 - if (is_wp_error($response)) {
108 - $error_message = $response->get_error_message();
109 - echo "VdoCipher: Something went wrong: $error_message";
110 - return "";
111 - }
112 - $OTP_Response = $response['body'];
113 - return json_decode($OTP_Response);
114 -}
115 -// Function called to get OTP, ends
116 -
117 -// VdoCipher Shortcode starts
118 43 function vdo_shortcode($atts)
119 44 {
120 - $vdo_args = shortcode_atts(
45 + extract(shortcode_atts(
121 46 array(
122 - 'title' => 'TITLE_OF_VIDEO',
123 - 'width' => get_option('vdo_default_width'),
124 - 'height' => get_option('vdo_default_height'),
125 - 'id' => 'id',
126 - 'no_annotate'=> false,
127 - 'vdo_theme'=> false,
128 - 'vdo_version'=> false,
129 - 'player_tech'=> ''
130 - ),
47 + 'title' => 'TITLE_OF_VIDEO',
48 + 'width' => get_option('vdo_default_width') . "px",
49 + 'height' => get_option('vdo_default_height') . "px",
50 + 'id' => 'id',
51 + 'no_annotate'=> false,
52 + 'version'=> 0,
53 + ),
131 54 $atts
132 - );
133 - $title = $vdo_args['title'];
134 - $width = $vdo_args['width'];
135 - $height = $vdo_args['height'];
136 - $id = $vdo_args['id'];
137 - $no_annotate = $vdo_args['no_annotate'];
138 - $vdo_theme = $vdo_args['vdo_theme'];
139 - $vdo_version = $vdo_args['vdo_version'];
140 - $player_tech = $vdo_args['player_tech'];
141 -
142 - if (!preg_match('/.*px$/', $width)) {
143 - $width = $width."px";
144 - }
145 - if (!preg_match('/.*px$/', $height)) {
146 - if ($height != 'auto') {
147 - $height = $height."px";
148 - }
149 - }
55 + ));
150 56 if (!$atts['id']) {
151 57 if (!$atts['title']) {
152 58 return "Required argument id for embedded video not found.";
153 - } else {
154 - $video = vdo_retrieve_id($title);
155 - if ($video == null) {
156 - return "404. Video not found.";
157 - }
158 59 }
60 + $params = array(
61 + 'search'=>array(
62 + 'title'=>$title
63 + ),
64 + 'page'=>1,
65 + 'limit'=>30,
66 + 'type'=>'json'
67 + );
68 + $video = vdo_send("videos", $params);
69 + $video = json_decode($video);
70 + if ($video == null) {
71 + return "404. Video not found.";
72 + }
73 + $video = $video[0]->id;
74 + if ($video == null) {
75 + return "No video with given title found.";
76 + }
159 77 } else {
160 78 $video = $id;
161 79 }
162 80
163 - // Initialize $otp_post_array, to be sent as part of OTP request, as for time-to-live 300
164 - $otp_post_array = array("ttl" => 300);
81 + $params = array(
82 + 'video'=>$video
83 + );
84 + $anno = false;
165 85 if (!function_exists("eval_date")) {
166 86 function eval_date($matches)
167 87 {
168 88 return current_time($matches[1]);
@@ -178,193 +98,84 @@
178 98 $vdo_annotate_code = str_replace('{username}', $current_user->user_login, $vdo_annotate_code);
179 99 $vdo_annotate_code = str_replace('{id}', $current_user->ID, $vdo_annotate_code);
180 100 }
181 101 $vdo_annotate_code = str_replace('{ip}', $_SERVER['REMOTE_ADDR'], $vdo_annotate_code);
182 - $vdo_annotate_code = preg_replace_callback('/{date\.([^}]+)}/', "eval_date", $vdo_annotate_code);
102 + $vdo_annotate_code = preg_replace_callback('/\{date\.([^\}]+)\}/', "eval_date", $vdo_annotate_code);
183 103 $vdo_annotate_code = apply_filters('vdocipher_annotate_postprocess', $vdo_annotate_code);
184 - // Add annotate code to $otp_post_array, which will be
185 - // converted to Json and then sent as POST body to API endpoint
186 104 if (!$no_annotate) {
187 - $otp_post_array["annotate"] = $vdo_annotate_code;
105 + $anno = array("annotate" => $vdo_annotate_code);
188 106 }
189 107 }
190 - // OTP is requested via vdo_otp function
191 - $OTP_Response = vdo_otp($video, $otp_post_array);
192 - $OTP = $OTP_Response->otp;
193 - $playbackInfo = $OTP_Response->playbackInfo;
194 -
108 + $OTP = vdo_send("otp", $params, $anno);
109 + $OTP = json_decode($OTP);
195 110 if (is_null($OTP)) {
196 - return "<span id='vdo$OTP' style='background:#555555;color:#FFFFFF'><h4>Video not found</h4></span>";
111 + $output = "<span id='vdo$OTP' style='background:#555555;color:#FFFFFF'><h4>Video not found</h4></span>";
112 + return $output;
197 113 }
114 + $OTP = $OTP->otp;
198 115
199 - // Version, legacy, for flash only
200 116 $version = 0;
201 117 if (isset($atts['version'])) {
202 118 $version = $atts['version'];
203 119 }
204 -
205 - // Video Embed version is retrieved from options table or from shortcode attribute
206 - if (!$vdo_version) {
207 - $vdo_embed_version_str = get_option('vdo_embed_version');
208 - } else {
209 - $vdo_embed_version_str = $vdo_version;
120 + $output = "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
121 + $output .= "<script> (function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){".
122 + " (v[o].d=v[o].d||[]).push(a);};";
123 + $output .= "if(!v[o].l) { v[o].l=1*new Date(); a=i.createElement(d), m=i.getElementsByTagName(d)[0]; a.async=1; ".
124 + "a.src=e; m.parentNode.insertBefore(a,m);}";
125 + $output .= " })(window,document,'script','//de122v0opjemw.cloudfront.net/vdo.js','vdo'); vdo.add({ ";
126 + $output .= "o: '$OTP', ";
127 + if ($version == 32) {
128 + $output .= "version: '$version' ";
210 129 }
211 -
212 - // Video Player theme, update and as shortcode attribute
213 - if (!$vdo_theme) {
214 - $vdo_player_theme = get_option('vdo_player_theme');
215 - } else {
216 - $vdo_player_theme = $vdo_theme;
217 - }
218 -
219 - // tech override custom names
220 - switch ($player_tech) {
221 - case "flash":
222 - case "nohtml5":
223 - $player_tech = "*,-dash";
224 - break;
225 - case "noflash":
226 - $player_tech = "*,-hss";
227 - break;
228 - case "nozen":
229 - $player_tech = "*,-zen";
230 - break;
231 - case "noios":
232 - $player_tech = "*,-hlse";
233 - break;
234 - default:
235 - break;
236 - }
237 -
238 - // Old Embed Code
239 - if ($vdo_embed_version_str === '0.5') {
240 - $output = "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
241 - $output .= "<script> (function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){".
242 - " (v[o].d=v[o].d||[]).push(a);};";
243 - $output .= "if(!v[o].l) { v[o].l=1*new Date();a=i.createElement(d),m=i.getElementsByTagName(d)[0];a.async=1;".
244 - "a.src=e; m.parentNode.insertBefore(a,m);}";
245 - $output .= " })(window,document,'script','//de122v0opjemw.cloudfront.net/vdo.js','vdo'); vdo.add({ ";
246 - $output .= "o: '$OTP', ";
247 - if ($version == 32) {
248 - $output .= "version: '$version' ";
249 - }
250 - $output .= "}); </script>";
251 - } else {
252 - //New embed code
253 - if ($player_tech === '') {
254 - if (get_option('vdo_watermark_flash_html') === 'flash') {
255 - $player_tech = "*,-dash";
256 - }
257 - }
258 - $techOverrideProperty = '';
259 - if ($player_tech !== '') {
260 - $techOverrideProperty = "techoverride: [" ;
261 - $techArray = explode(',', $player_tech);
262 - for ($i = 0; $i < sizeof($techArray); $i++) {
263 - $techStr = $techArray[$i];
264 - $techOverrideProperty .= "'$techStr'";
265 - if ($i !== sizeof($techArray)-1) {
266 - $techOverrideProperty .= ", ";
267 - }
268 - }
269 - $techOverrideProperty .= "],";
270 - }
271 - $output = <<<END
272 - <div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>
273 - <script>(function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){
274 - (v[o].d=v[o].d||[]).push(a);};
275 - if(!v[o].l) { v[o].l=1*new Date(); a=i.createElement(d), m=i.getElementsByTagName(d)[0];
276 - a.async=1; a.src=e; m.parentNode.insertBefore(a,m);}
277 - })(window,document,'script','https://d1z78r8i505acl.cloudfront.net/playerAssets/$vdo_embed_version_str/vdo.js','vdo');
278 - vdo.add({
279 - otp: '$OTP',
280 - playbackInfo: '$playbackInfo',
281 - theme: '$vdo_player_theme',
282 - plugins: [{
283 - name: 'keyboard',
284 - options: {
285 - preset: 'default',
286 - bindings: {
287 - 'Left' : (player) => player.seek(player.currentTime - 15),
288 - 'Right' : (player) => player.seek(player.currentTime + 15),
289 - },
290 - }
291 - }],
292 - container: document.querySelector('#vdo$OTP'),
293 - $techOverrideProperty
294 - })
295 - </script>
296 -END;
297 - $speedOptions = esc_attr(get_option('vdo_player_speed'));
298 - $speedPattern = '/^\d.\d{1,2}(,\d.\d{1,2})+$/';
299 - if ($speedOptions !== false && preg_match($speedPattern, $speedOptions)) {
300 - $output .= <<<END
301 - <script>
302 - (function () {
303 - var originalReadyFunction = window.onVdoCipherAPIReady;
304 - // private API; do not use anywhere else; might change without notice
305 - var index = vdo.d.length - 1;
306 - window.onVdoCipherAPIReady = () => {
307 - if (originalReadyFunction) originalReadyFunction();
308 - var v_ = vdo.getObjects()[index];
309 - v_.addEventListener('load', () => {
310 - v_.availablePlaybackRates = [$speedOptions]
311 - });
312 - }
313 - })()
314 - </script>
315 -END;
316 - }
317 - }
130 + $output .= "}); </script>";
318 131 return $output;
319 132 }
133 +
320 134 add_shortcode('vdo', 'vdo_shortcode');
321 -// VdoCipher Shortcode ends
322 135
323 -// adding the Settings link, starts
136 +
137 +/// adding the settings link
324 138 $plugin = plugin_basename(__FILE__);
325 139 add_filter("plugin_action_links_$plugin", 'vdo_settings_link');
326 140
327 141 function vdo_settings_link($links)
328 142 {
329 - $settings_link = '<a href="options-general.php?page=vdocipher">Settings</a>';
143 + $settings_link = '<a href="options-general.php?page=vdocipher.php">Settings</a>';
330 144 array_unshift($links, $settings_link);
331 145 return $links;
332 146 }
333 -// adding the Settings link, ends
334 147
335 -// add the menu item and register settings (3 functions), starts
148 +
149 +/// add the menu item and register settings
336 150 if (is_admin()) { // admin actions
151 + add_action('admin_menu', 'vdo_menu');
337 152 add_action('admin_init', 'register_vdo_settings');
338 - add_action('admin_menu', 'vdo_menu');
153 +} else {
154 + // non-admin enqueues, actions, and filters
339 155 }
340 156 function vdo_menu()
341 157 {
342 - add_menu_page(
343 - 'VdoCipher Options',
344 - 'VdoCipher',
345 - 'manage_options',
346 - 'vdocipher',
347 - 'vdo_options',
348 - plugin_dir_url(__FILE__).'images/logo.png'
349 - );
158 + add_options_page('VdoCipher Options', 'VdoCipher', 'manage_options', 'vdocipher', 'vdo_options');
350 159 }
351 -
352 160 function vdo_options()
353 161 {
354 162 if (!get_option('vdo_default_height')) {
355 - update_option('vdo_default_height', 'auto');
163 + update_option('vdo_default_height', '360');
356 164 }
357 165 if (!get_option('vdo_default_width')) {
358 - update_option('vdo_default_width', '1280');
166 + update_option('vdo_default_width', '640');
359 167 }
168 + $vdo_client_key = get_option('vdo_client_key');
169 + if (!$vdo_client_key && strlen($vdo_client_key) != 64) {
170 + vdo_show_form_client_key();
171 + return "";
172 + }
360 173 if (!current_user_can('manage_options')) {
361 - wp_die(__('You do not have sufficient permissions to access this page.'));
174 + wp_die(__('You do not have sufficient permissions to access this page.'));
362 175 }
363 176 include('include/options.php');
364 - return "";
365 177 }
366 -
367 178 function register_vdo_settings()
368 179 {
369 180 // whitelist options
370 181 register_setting('vdo_option-group', 'vdo_client_key');
@@ -370,84 +181,16 @@
370 181 register_setting('vdo_option-group', 'vdo_client_key');
371 182 register_setting('vdo_option-group', 'vdo_default_height');
372 183 register_setting('vdo_option-group', 'vdo_default_width');
373 184 register_setting('vdo_option-group', 'vdo_annotate_code');
374 - register_setting('vdo_option-group', 'vdo_embed_version');
375 - register_setting('vdo_option-group', 'vdo_player_theme');
376 - register_setting('vdo_option-group', 'vdo_watermark_flash_html');
377 - register_setting('vdo_option-group', 'vdo_plugin_version');
378 - register_setting('vdo_option-group', 'vdo_player_speed');
379 - register_setting('vdo_custom_theme', 'vdo_player_theme_options');
380 185 }
381 -// add the menu item and register settings (3 functions), ends
382 186
383 -// Activation Hook starts
384 -function vdo_activate()
187 +/// adding a section for asking for the client key
188 +function vdo_show_form_client_key()
385 189 {
386 - add_option('vdo_default_height', 'auto');
387 - add_option('vdo_default_width', 1280);
388 - add_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
389 - add_option('vdo_player_theme', VDOCIPHER_DEFAULT_THEME);
390 - add_option('vdo_watermark_flash_html', 'html5');
190 + include('include/setting_form.php');
391 191 }
392 -register_activation_hook(__FILE__, 'vdo_activate');
393 -
394 -// Registering and specifying Gutenberg block
395 -function vdo_register_block()
396 -{
397 - if (!function_exists('register_block_type')) {
398 - return ;
399 - }
400 - wp_register_script(
401 - 'vdo-block-script',
402 - plugins_url('/include/block/dist/blocks.build.js', __FILE__),
403 - array('wp-blocks', 'wp-element', 'wp-editor', 'wp-i18n')
404 - );
405 - wp_register_style(
406 - 'vdo-block-base-style',
407 - plugins_url('/include/block/dist/blocks.style.build.css', __FILE__),
408 - array('wp-blocks')
409 - );
410 - wp_register_style(
411 - 'vdo-block-editor-style',
412 - plugins_url('/include/block/dist/blocks.editor.build.css', __FILE__),
413 - array('wp-edit-blocks')
414 - );
415 - register_block_type(
416 - 'vdo/block',
417 - array(
418 - 'editor_script'=>'vdo-block-script',
419 - 'editor_style'=>'vdo-block-editor-style',
420 - 'style'=>'vdo-block-base-style',
421 - 'attributes'=>array(
422 - 'id'=>array(
423 - 'type'=>'string',
424 - ),
425 - 'width'=>array(
426 - 'type'=>'string',
427 - 'default'=>get_option('vdo_default_width')
428 - ),
429 - 'height'=>array(
430 - 'type'=>'string',
431 - 'default'=>get_option('vdo_default_height')
432 - ),
433 - 'vdo_theme'=>array(
434 - 'type'=>'string',
435 - 'default'=>get_option('vdo_player_theme')
436 - ),
437 - 'vdo_version'=>array(
438 - 'type'=>'string',
439 - 'default'=>get_option('vdo_embed_version')
440 - ),
441 - ),
442 - 'render_callback'=>'vdo_shortcode'
443 - )
444 - );
445 -}
446 -
447 -add_action('init', 'vdo_register_block');
448 -
449 -// Deactivation Hook starts
192 +register_deactivation_hook(__FILE__, 'vdo_deactivate');
450 193 function vdo_deactivate()
451 194 {
452 195 delete_option('vdo_client_key');
453 196 delete_option('vdo_default_width');
@@ -452,18 +195,19 @@
452 195 delete_option('vdo_client_key');
453 196 delete_option('vdo_default_width');
454 197 delete_option('vdo_default_height');
455 198 delete_option('vdo_annotate_code');
456 - delete_option('vdo_embed_version');
457 - delete_option('vdo_player_theme');
458 - delete_option('vdo_watermark_flash_html');
459 - delete_option('vdo_player_theme_options');
460 - delete_option('vdo_plugin_version');
461 - delete_option('vdo_player_speed');
462 199 }
463 -register_deactivation_hook(__FILE__, 'vdo_deactivate');
464 -
465 -// Admin notice to configure plugin for new installs, starts
200 +function vdo_activate()
201 +{
202 + if (!get_option('vdo_default_height')) {
203 + update_option('vdo_default_height', '400');
204 + }
205 + if (!get_option('vdo_default_width')) {
206 + update_option('vdo_default_width', '640');
207 + }
208 +}
209 +register_activation_hook(__FILE__, 'vdo_activate');
466 210 function vdo_admin_notice()
467 211 {
468 212 if ((!get_option('vdo_client_key') || strlen(get_option('vdo_client_key')) != 64)
469 213 && basename($_SERVER['PHP_SELF']) == "plugins.php"