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 +263 -74 1.221.26 View file →
@@ -2,9 +2,9 @@
2 2 /**
3 3 * Plugin Name: VdoCipher
4 4 * Plugin URI: https://www.vdocipher.com
5 5 * Description: Secured video hosting for wordpress
6 - * Version: 1.22
6 + * Version: 1.26
7 7 * Author: VdoCipher
8 8 * Author URI: https://www.vdocipher.com
9 9 * License: GPL2
10 10 */
@@ -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 = "https://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.6.4');
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 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,9 +243,8 @@
146 243 break;
147 244 default:
148 245 break;
149 246 }
150 - // tech override ends
151 247
152 248 // Old Embed Code
153 249 if ($vdo_embed_version_str === '0.5') {
154 250 $output = "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
@@ -164,13 +260,13 @@
164 260 $output .= "}); </script>";
165 261 } else {
166 262 //New embed code
167 263 if ($player_tech === '') {
168 - if (get_option(vdo_watermark_flash_html) === 'flash') {
264 + if (get_option('vdo_watermark_flash_html') === 'flash') {
169 265 $player_tech = "*,-dash";
170 266 }
171 267 }
172 - $output .= "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
268 + $output = "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
173 269 $output .= "<script>(function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){".
174 270 "(v[o].d=v[o].d||[]).push(a);};";
175 271 $output .= "if(!v[o].l) { v[o].l=1*new Date(); a=i.createElement(d), m=i.getElementsByTagName(d)[0];";
176 272 $output .= "a.async=1; a.src=e; m.parentNode.insertBefore(a,m);}";
@@ -178,11 +274,20 @@
178 274 $output .= "$vdo_embed_version_str";
179 275 $output .= "/vdo.js','vdo');";
180 276 $output .= "vdo.add({";
181 277 $output .= "otp: '$OTP',";
182 - $output .= "playbackInfo: btoa(JSON.stringify({";
183 - $output .= "videoId: '$video'})),";
278 + $output .= "playbackInfo: '$playbackInfo',";
184 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 .= "}],";
185 290 if ($player_tech !== '') {
186 291 $output .= "techoverride: [" ;
187 292 $techarray = explode(',', $player_tech);
188 293 for ($i = 0; $i < sizeof($techarray); $i++) {
@@ -198,12 +303,12 @@
198 303 $output .= "</script>";
199 304 }
200 305 return $output;
201 306 }
202 -
203 307 add_shortcode('vdo', 'vdo_shortcode');
308 +// VdoCipher Shortcode ends
204 309
205 -/// adding the settings link
310 +// adding the Settings link, starts
206 311 $plugin = plugin_basename(__FILE__);
207 312 add_filter("plugin_action_links_$plugin", 'vdo_settings_link');
208 313
209 314 function vdo_settings_link($links)
@@ -211,13 +316,14 @@
211 316 $settings_link = '<a href="options-general.php?page=vdocipher">Settings</a>';
212 317 array_unshift($links, $settings_link);
213 318 return $links;
214 319 }
320 +// adding the Settings link, ends
215 321
216 -/// add the menu item and register settings
322 +// add the menu item and register settings (3 functions), starts
217 323 if (is_admin()) { // admin actions
324 + add_action('admin_init', 'register_vdo_settings');
218 325 add_action('admin_menu', 'vdo_menu');
219 - add_action('admin_init', 'register_vdo_settings');
220 326 } else {
221 327 // non-admin enqueues, actions, and filters
222 328 }
223 329 function vdo_menu()
@@ -229,9 +335,23 @@
229 335 'vdocipher',
230 336 'vdo_options',
231 337 plugin_dir_url(__FILE__).'images/logo.png'
232 338 );
339 + add_submenu_page(
340 + null,
341 + 'Video Player Themes',
342 + 'CustomPlayer',
343 + 'manage_options',
344 + 'themesvdo',
345 + 'themesvdo'
346 + );
233 347 }
348 +
349 +function themesvdo()
350 +{
351 + include('include/player_themes.php');
352 +}
353 +
234 354 function vdo_options()
235 355 {
236 356 if (!get_option('vdo_default_height')) {
237 357 update_option('vdo_default_height', 'auto');
@@ -258,26 +378,20 @@
258 378 register_setting('vdo_option-group', 'vdo_annotate_code');
259 379 register_setting('vdo_option-group', 'vdo_embed_version');
260 380 register_setting('vdo_option-group', 'vdo_player_theme');
261 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');
262 384 }
385 +// add the menu item and register settings (3 functions), ends
263 386
264 -/// adding a section for asking for the client key
387 +// section for client key for new users
265 388 function vdo_show_form_client_key()
266 389 {
267 390 include('include/setting_form.php');
268 391 }
269 -register_deactivation_hook(__FILE__, 'vdo_deactivate');
270 -function vdo_deactivate()
271 -{
272 - delete_option('vdo_client_key');
273 - delete_option('vdo_default_width');
274 - delete_option('vdo_default_height');
275 - delete_option('vdo_annotate_code');
276 - delete_option('vdo_embed_version');
277 - delete_option('vdo_player_theme');
278 - delete_option('vdo_watermark_flash_html');
279 -}
392 +
393 +// Activation Hook starts
280 394 function vdo_activate()
281 395 {
282 396 if ((get_option('vdo_default_height')) == false) {
283 397 update_option('vdo_default_height', 'auto');
@@ -286,9 +400,9 @@
286 400 update_option('vdo_default_width', '1280');
287 401 }
288 402 //https://stackoverflow.com/a/2173318/5022684
289 403 if ((get_option('vdo_embed_version')) == false) {
290 - update_option('vdo_embed_version', '1.6.4');
404 + update_option('vdo_embed_version', VDOCIPHER_PLAYER_VERSION);
291 405 }
292 406 if ((get_option('vdo_player_theme')) == false) {
293 407 update_option('vdo_player_theme', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
294 408 }
@@ -294,10 +408,85 @@
294 408 }
295 409 if ((get_option('vdo_watermark_flash_html')) == false) {
296 410 update_option('vdo_watermark_flash_html', 'html5');
297 411 }
412 + if ((get_option('vdo_plugin_version')) == false) {
413 + update_option('vdo_plugin_version', VDOCIPHER_PLUGIN_VERSION);
414 + }
298 415 }
299 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
300 489 function vdo_admin_notice()
301 490 {
302 491 if ((!get_option('vdo_client_key') || strlen(get_option('vdo_client_key')) != 64)
303 492 && basename($_SERVER['PHP_SELF']) == "plugins.php"