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 +300 -92 1.201.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.20
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,75 +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 - 'player_tech'=> ''
51 - ),
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 + ),
52 131 $atts
53 - ));
54 - if((get_option('vdo_default_height')) == 'auto') {
55 - $height = 'auto';
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";
56 145 }
146 + if (!preg_match('/.*px$/', $height)) {
147 + if ($height != 'auto') {
148 + $height = $height."px";
149 + }
150 + }
57 151 if (!$atts['id']) {
58 152 if (!$atts['title']) {
59 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 + }
60 159 }
61 - $params = array(
62 - 'search'=>array(
63 - 'title'=>$title
64 - ),
65 - 'page'=>1,
66 - 'limit'=>30,
67 - 'type'=>'json'
68 - );
69 - $video = vdo_send("videos", $params);
70 - $video = json_decode($video);
71 - if ($video == null) {
72 - return "404. Video not found.";
73 - }
74 - $video = $video[0]->id;
75 - if ($video == null) {
76 - return "No video with given title found.";
77 - }
78 160 } else {
79 161 $video = $id;
80 162 }
81 163
82 - $params = array(
83 - 'video'=>$video
84 - );
85 - $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);
86 166 if (!function_exists("eval_date")) {
87 167 function eval_date($matches)
88 168 {
89 169 return current_time($matches[1]);
@@ -101,34 +181,51 @@
101 181 }
102 182 $vdo_annotate_code = str_replace('{ip}', $_SERVER['REMOTE_ADDR'], $vdo_annotate_code);
103 183 $vdo_annotate_code = preg_replace_callback('/\{date\.([^\}]+)\}/', "eval_date", $vdo_annotate_code);
104 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
105 187 if (!$no_annotate) {
106 - $anno = array("annotate" => $vdo_annotate_code);
188 + $otp_post_array["annotate"] = $vdo_annotate_code;
107 189 }
108 190 }
109 - $OTP = vdo_send("otp", $params, $anno);
110 - $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 +
111 196 if (is_null($OTP)) {
112 197 $output = "<span id='vdo$OTP' style='background:#555555;color:#FFFFFF'><h4>Video not found</h4></span>";
113 198 return $output;
114 199 }
115 - $OTP = $OTP->otp;
116 200
201 + // Version, legacy, for flash only
117 202 $version = 0;
118 203 if (isset($atts['version'])) {
119 204 $version = $atts['version'];
120 205 }
206 +
207 + // Video Embed version is retrieved from options table or from shortcode attribute
121 208 if ((get_option('vdo_embed_version')) == false) {
122 - update_option('vdo_embed_version', '1.5.0');
209 + update_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
123 210 }
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
124 218 if ((get_option('vdo_player_theme')) == false) {
125 - update_option('vdo_player_theme','9ae8bbe8dd964ddc9bdb932cca1cb59a');
219 + update_option('vdo_player_theme', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
126 220 }
127 - $vdo_embed_version_str = get_option('vdo_embed_version');
128 - $vdo_player_theme = get_option('vdo_player_theme');
221 + if (!$vdo_theme) {
222 + $vdo_player_theme = get_option('vdo_player_theme');
223 + } else {
224 + $vdo_player_theme = $vdo_theme;
225 + }
129 226
130 - // tech override custom names start
227 + // tech override custom names
131 228 switch ($player_tech) {
132 229 case "flash":
133 230 $player_tech = "*,-dash";
134 231 break;
@@ -146,16 +243,15 @@
146 243 break;
147 244 default:
148 245 break;
149 246 }
150 - // tech override ends
151 247
152 248 // Old Embed Code
153 - if($vdo_embed_version_str === '0.5') {
249 + if ($vdo_embed_version_str === '0.5') {
154 250 $output = "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
155 251 $output .= "<script> (function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){".
156 252 " (v[o].d=v[o].d||[]).push(a);};";
157 - $output .= "if(!v[o].l) { v[o].l=1*new Date(); a=i.createElement(d), m=i.getElementsByTagName(d)[0]; a.async=1; ".
253 + $output .= "if(!v[o].l) { v[o].l=1*new Date();a=i.createElement(d),m=i.getElementsByTagName(d)[0];a.async=1;".
158 254 "a.src=e; m.parentNode.insertBefore(a,m);}";
159 255 $output .= " })(window,document,'script','//de122v0opjemw.cloudfront.net/vdo.js','vdo'); vdo.add({ ";
160 256 $output .= "o: '$OTP', ";
161 257 if ($version == 32) {
@@ -161,13 +257,18 @@
161 257 if ($version == 32) {
162 258 $output .= "version: '$version' ";
163 259 }
164 260 $output .= "}); </script>";
165 - }
166 - //New embed code
167 - else {
168 - $output .= "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
169 - $output .= "<script>(function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){ (v[o].d=v[o].d||[]).push(a);};";
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);};";
170 271 $output .= "if(!v[o].l) { v[o].l=1*new Date(); a=i.createElement(d), m=i.getElementsByTagName(d)[0];";
171 272 $output .= "a.async=1; a.src=e; m.parentNode.insertBefore(a,m);}";
172 273 $output .= "})(window,document,'script','https://d1z78r8i505acl.cloudfront.net/playerAssets/";
173 274 $output .= "$vdo_embed_version_str";
@@ -173,20 +274,31 @@
173 274 $output .= "$vdo_embed_version_str";
174 275 $output .= "/vdo.js','vdo');";
175 276 $output .= "vdo.add({";
176 277 $output .= "otp: '$OTP',";
177 - $output .= "playbackInfo: btoa(JSON.stringify({";
178 - $output .= "videoId: '$video'})),";
278 + $output .= "playbackInfo: '$playbackInfo',";
179 279 $output .= "theme: '$vdo_player_theme',";
180 - if($player_tech !== ''){
181 - $output .= "techoverride: [" ;
182 - $techarray = explode(',', $player_tech);
183 - for($i = 0; $i < sizeof($techarray); $i++){
184 - $output .= "'$techarray[$i]'";
185 - if($i !== sizeof($techarray)-1)
186 - $output .= ", ";
187 - }
188 - $output .= "],";
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 .= "],";
189 301 }
190 302 $output .= "container: document.querySelector('#vdo$OTP'),});";
191 303 $output .= "</script>";
192 304 }
@@ -191,12 +303,12 @@
191 303 $output .= "</script>";
192 304 }
193 305 return $output;
194 306 }
195 -
196 307 add_shortcode('vdo', 'vdo_shortcode');
308 +// VdoCipher Shortcode ends
197 309
198 -/// adding the settings link
310 +// adding the Settings link, starts
199 311 $plugin = plugin_basename(__FILE__);
200 312 add_filter("plugin_action_links_$plugin", 'vdo_settings_link');
201 313
202 314 function vdo_settings_link($links)
@@ -204,20 +316,42 @@
204 316 $settings_link = '<a href="options-general.php?page=vdocipher">Settings</a>';
205 317 array_unshift($links, $settings_link);
206 318 return $links;
207 319 }
320 +// adding the Settings link, ends
208 321
209 -/// add the menu item and register settings
322 +// add the menu item and register settings (3 functions), starts
210 323 if (is_admin()) { // admin actions
324 + add_action('admin_init', 'register_vdo_settings');
211 325 add_action('admin_menu', 'vdo_menu');
212 - add_action('admin_init', 'register_vdo_settings');
213 326 } else {
214 327 // non-admin enqueues, actions, and filters
215 328 }
216 329 function vdo_menu()
217 330 {
218 - add_menu_page('VdoCipher Options', 'VdoCipher', 'manage_options', 'vdocipher', 'vdo_options', plugin_dir_url(__FILE__).'images/logo.png');
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 + );
219 347 }
348 +
349 +function themesvdo()
350 +{
351 + include('include/player_themes.php');
352 +}
353 +
220 354 function vdo_options()
221 355 {
222 356 if (!get_option('vdo_default_height')) {
223 357 update_option('vdo_default_height', 'auto');
@@ -243,25 +377,21 @@
243 377 register_setting('vdo_option-group', 'vdo_default_width');
244 378 register_setting('vdo_option-group', 'vdo_annotate_code');
245 379 register_setting('vdo_option-group', 'vdo_embed_version');
246 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');
247 384 }
385 +// add the menu item and register settings (3 functions), ends
248 386
249 -/// adding a section for asking for the client key
387 +// section for client key for new users
250 388 function vdo_show_form_client_key()
251 389 {
252 390 include('include/setting_form.php');
253 391 }
254 -register_deactivation_hook(__FILE__, 'vdo_deactivate');
255 -function vdo_deactivate()
256 -{
257 - delete_option('vdo_client_key');
258 - delete_option('vdo_default_width');
259 - delete_option('vdo_default_height');
260 - delete_option('vdo_annotate_code');
261 - delete_option('vdo_embed_version');
262 - delete_option('vdo_player_theme');
263 -}
392 +
393 +// Activation Hook starts
264 394 function vdo_activate()
265 395 {
266 396 if ((get_option('vdo_default_height')) == false) {
267 397 update_option('vdo_default_height', 'auto');
@@ -270,15 +400,93 @@
270 400 update_option('vdo_default_width', '1280');
271 401 }
272 402 //https://stackoverflow.com/a/2173318/5022684
273 403 if ((get_option('vdo_embed_version')) == false) {
274 - update_option('vdo_embed_version', '1.5.0');
404 + update_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
275 405 }
276 406 if ((get_option('vdo_player_theme')) == false) {
277 - update_option('vdo_player_theme','9ae8bbe8dd964ddc9bdb932cca1cb59a');
407 + update_option('vdo_player_theme', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
278 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 + }
279 415 }
280 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
474 +function vdo_deactivate()
475 +{
476 + delete_option('vdo_client_key');
477 + delete_option('vdo_default_width');
478 + delete_option('vdo_default_height');
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');
485 +}
486 +register_deactivation_hook(__FILE__, 'vdo_deactivate');
487 +
488 +// Admin notice to configure plugin for new installs, starts
281 489 function vdo_admin_notice()
282 490 {
283 491 if ((!get_option('vdo_client_key') || strlen(get_option('vdo_client_key')) != 64)
284 492 && basename($_SERVER['PHP_SELF']) == "plugins.php"