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 +326 -82 1.181.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.18
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,39 +181,77 @@
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 }
206 +
207 + // Video Embed version is retrieved from options table or from shortcode attribute
117 208 if ((get_option('vdo_embed_version')) == false) {
118 - update_option('vdo_embed_version', '0.5');
209 + update_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
119 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
120 218 if ((get_option('vdo_player_theme')) == false) {
121 - update_option('vdo_player_theme','9ae8bbe8dd964ddc9bdb932cca1cb59a');
219 + update_option('vdo_player_theme', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
122 220 }
123 - $vdo_embed_version_str = get_option('vdo_embed_version');
124 - $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 + }
125 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 +
126 248 // Old Embed Code
127 - if($vdo_embed_version_str === '0.5') {
249 + if ($vdo_embed_version_str === '0.5') {
128 250 $output = "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
129 251 $output .= "<script> (function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){".
130 252 " (v[o].d=v[o].d||[]).push(a);};";
131 - $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;".
132 254 "a.src=e; m.parentNode.insertBefore(a,m);}";
133 255 $output .= " })(window,document,'script','//de122v0opjemw.cloudfront.net/vdo.js','vdo'); vdo.add({ ";
134 256 $output .= "o: '$OTP', ";
135 257 if ($version == 32) {
@@ -135,13 +257,18 @@
135 257 if ($version == 32) {
136 258 $output .= "version: '$version' ";
137 259 }
138 260 $output .= "}); </script>";
139 - }
140 - //New embed code
141 - else {
142 - $output .= "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
143 - $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);};";
144 271 $output .= "if(!v[o].l) { v[o].l=1*new Date(); a=i.createElement(d), m=i.getElementsByTagName(d)[0];";
145 272 $output .= "a.async=1; a.src=e; m.parentNode.insertBefore(a,m);}";
146 273 $output .= "})(window,document,'script','https://d1z78r8i505acl.cloudfront.net/playerAssets/";
147 274 $output .= "$vdo_embed_version_str";
@@ -147,20 +274,41 @@
147 274 $output .= "$vdo_embed_version_str";
148 275 $output .= "/vdo.js','vdo');";
149 276 $output .= "vdo.add({";
150 277 $output .= "otp: '$OTP',";
151 - $output .= "playbackInfo: btoa(JSON.stringify({";
152 - $output .= "videoId: '$video'})),";
278 + $output .= "playbackInfo: '$playbackInfo',";
153 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 + }
154 302 $output .= "container: document.querySelector('#vdo$OTP'),});";
155 303 $output .= "</script>";
156 304 }
157 305 return $output;
158 306 }
159 -
160 307 add_shortcode('vdo', 'vdo_shortcode');
308 +// VdoCipher Shortcode ends
161 309
162 -/// adding the settings link
310 +// adding the Settings link, starts
163 311 $plugin = plugin_basename(__FILE__);
164 312 add_filter("plugin_action_links_$plugin", 'vdo_settings_link');
165 313
166 314 function vdo_settings_link($links)
@@ -168,27 +316,49 @@
168 316 $settings_link = '<a href="options-general.php?page=vdocipher">Settings</a>';
169 317 array_unshift($links, $settings_link);
170 318 return $links;
171 319 }
320 +// adding the Settings link, ends
172 321
173 -/// add the menu item and register settings
322 +// add the menu item and register settings (3 functions), starts
174 323 if (is_admin()) { // admin actions
324 + add_action('admin_init', 'register_vdo_settings');
175 325 add_action('admin_menu', 'vdo_menu');
176 - add_action('admin_init', 'register_vdo_settings');
177 326 } else {
178 327 // non-admin enqueues, actions, and filters
179 328 }
180 329 function vdo_menu()
181 330 {
182 - 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 + );
183 347 }
348 +
349 +function themesvdo()
350 +{
351 + include('include/player_themes.php');
352 +}
353 +
184 354 function vdo_options()
185 355 {
186 356 if (!get_option('vdo_default_height')) {
187 - update_option('vdo_default_height', '360');
357 + update_option('vdo_default_height', 'auto');
188 358 }
189 359 if (!get_option('vdo_default_width')) {
190 - update_option('vdo_default_width', '640');
360 + update_option('vdo_default_width', '1280');
191 361 }
192 362 $vdo_client_key = get_option('vdo_client_key');
193 363 if (!$vdo_client_key && strlen($vdo_client_key) != 64) {
194 364 vdo_show_form_client_key();
@@ -207,42 +377,116 @@
207 377 register_setting('vdo_option-group', 'vdo_default_width');
208 378 register_setting('vdo_option-group', 'vdo_annotate_code');
209 379 register_setting('vdo_option-group', 'vdo_embed_version');
210 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');
211 384 }
385 +// add the menu item and register settings (3 functions), ends
212 386
213 -/// adding a section for asking for the client key
387 +// section for client key for new users
214 388 function vdo_show_form_client_key()
215 389 {
216 390 include('include/setting_form.php');
217 391 }
218 -register_deactivation_hook(__FILE__, 'vdo_deactivate');
219 -function vdo_deactivate()
220 -{
221 - delete_option('vdo_client_key');
222 - delete_option('vdo_default_width');
223 - delete_option('vdo_default_height');
224 - delete_option('vdo_annotate_code');
225 - delete_option('vdo_embed_version');
226 - delete_option('vdo_player_theme');
227 -}
392 +
393 +// Activation Hook starts
228 394 function vdo_activate()
229 395 {
230 396 if ((get_option('vdo_default_height')) == false) {
231 - update_option('vdo_default_height', '360');
397 + update_option('vdo_default_height', 'auto');
232 398 }
233 399 if ((get_option('vdo_default_width')) == false) {
234 - update_option('vdo_default_width', '640');
400 + update_option('vdo_default_width', '1280');
235 401 }
236 402 //https://stackoverflow.com/a/2173318/5022684
237 403 if ((get_option('vdo_embed_version')) == false) {
238 - update_option('vdo_embed_version', '0.5');
404 + update_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
239 405 }
240 406 if ((get_option('vdo_player_theme')) == false) {
241 - update_option('vdo_player_theme','9ae8bbe8dd964ddc9bdb932cca1cb59a');
407 + update_option('vdo_player_theme', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
242 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 + }
243 415 }
244 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
245 489 function vdo_admin_notice()
246 490 {
247 491 if ((!get_option('vdo_client_key') || strlen(get_option('vdo_client_key')) != 64)
248 492 && basename($_SERVER['PHP_SELF']) == "plugins.php"