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