PluginProbe
VdoCipher: Secure Video Player and Hosting / 1.25
VdoCipher: Secure Video Player and Hosting v1.25
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
vdocipher / vdocipher.php

vdocipher.php in VdoCipher: Secure Video Player and Hosting 1.25, at vdocipher.php

505 lines 17.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Name: VdoCipher
4 * Plugin URI: https://www.vdocipher.com
5 * Description: Secured video hosting for wordpress
6 * Version: 1.25
7 * Author: VdoCipher
8 * Author URI: https://www.vdocipher.com
9 * License: GPL2
10 */
11
12 if (__FILE__ == $_SERVER['SCRIPT_FILENAME']) {
13 header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
14 exit("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head>\r\n<title>404 Not Found</title>\r\n".
15 "</head><body>\r\n<h1>Not Found</h1>\r\n<p>The requested URL " . $_SERVER['SCRIPT_NAME'] . " was not found on ".
16 "this server.</p>\r\n</body></html>");
17 }
18
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()
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 {
56 $client_key = get_option('vdo_client_key');
57 if ($client_key == false || $client_key == "") {
58 return "Plugin not configured. Please set the API key to embed videos.";
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
83
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 );
106 if (is_wp_error($response)) {
107 $error_message = $response->get_error_message();
108 echo "VdoCipher: Something went wrong: $error_message";
109 return "";
110 }
111 $OTP_Response = $response['body'];
112 return json_decode($OTP_Response);
113 }
114 // Function called to get OTP, ends
115
116 // VdoCipher Shortcode starts
117 function vdo_shortcode($atts)
118 {
119 $vdo_args = shortcode_atts(
120 array(
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 ),
131 $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 $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 }
151 if (!$atts['id']) {
152 if (!$atts['title']) {
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 }
159 }
160 } else {
161 $video = $id;
162 }
163
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);
166 if (!function_exists("eval_date")) {
167 function eval_date($matches)
168 {
169 return current_time($matches[1]);
170 }
171 }
172 if (get_option('vdo_annotate_code') != "") {
173 $current_user = wp_get_current_user();
174 $vdo_annotate_code = get_option('vdo_annotate_code');
175 $vdo_annotate_code = apply_filters('vdocipher_annotate_preprocess', $vdo_annotate_code);
176 if (is_user_logged_in()) {
177 $vdo_annotate_code = str_replace('{name}', $current_user->display_name, $vdo_annotate_code);
178 $vdo_annotate_code = str_replace('{email}', $current_user->user_email, $vdo_annotate_code);
179 $vdo_annotate_code = str_replace('{username}', $current_user->user_login, $vdo_annotate_code);
180 $vdo_annotate_code = str_replace('{id}', $current_user->ID, $vdo_annotate_code);
181 }
182 $vdo_annotate_code = str_replace('{ip}', $_SERVER['REMOTE_ADDR'], $vdo_annotate_code);
183 $vdo_annotate_code = preg_replace_callback('/\{date\.([^\}]+)\}/', "eval_date", $vdo_annotate_code);
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
187 if (!$no_annotate) {
188 $otp_post_array["annotate"] = $vdo_annotate_code;
189 }
190 }
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
196 if (is_null($OTP)) {
197 $output = "<span id='vdo$OTP' style='background:#555555;color:#FFFFFF'><h4>Video not found</h4></span>";
198 return $output;
199 }
200
201 // Version, legacy, for flash only
202 $version = 0;
203 if (isset($atts['version'])) {
204 $version = $atts['version'];
205 }
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);
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
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 }
305 return $output;
306 }
307 add_shortcode('vdo', 'vdo_shortcode');
308 // VdoCipher Shortcode ends
309
310 // adding the Settings link, starts
311 $plugin = plugin_basename(__FILE__);
312 add_filter("plugin_action_links_$plugin", 'vdo_settings_link');
313
314 function vdo_settings_link($links)
315 {
316 $settings_link = '<a href="options-general.php?page=vdocipher">Settings</a>';
317 array_unshift($links, $settings_link);
318 return $links;
319 }
320 // adding the Settings link, ends
321
322 // add the menu item and register settings (3 functions), starts
323 if (is_admin()) { // admin actions
324 add_action('admin_init', 'register_vdo_settings');
325 add_action('admin_menu', 'vdo_menu');
326 } else {
327 // non-admin enqueues, actions, and filters
328 }
329 function vdo_menu()
330 {
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 );
347 }
348
349 function themesvdo()
350 {
351 include('include/player_themes.php');
352 }
353
354 function vdo_options()
355 {
356 if (!get_option('vdo_default_height')) {
357 update_option('vdo_default_height', 'auto');
358 }
359 if (!get_option('vdo_default_width')) {
360 update_option('vdo_default_width', '1280');
361 }
362 $vdo_client_key = get_option('vdo_client_key');
363 if (!$vdo_client_key && strlen($vdo_client_key) != 64) {
364 vdo_show_form_client_key();
365 return "";
366 }
367 if (!current_user_can('manage_options')) {
368 wp_die(__('You do not have sufficient permissions to access this page.'));
369 }
370 include('include/options.php');
371 }
372 function register_vdo_settings()
373 {
374 // whitelist options
375 register_setting('vdo_option-group', 'vdo_client_key');
376 register_setting('vdo_option-group', 'vdo_default_height');
377 register_setting('vdo_option-group', 'vdo_default_width');
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');
384 }
385 // add the menu item and register settings (3 functions), ends
386
387 // section for client key for new users
388 function vdo_show_form_client_key()
389 {
390 include('include/setting_form.php');
391 }
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
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
489 function vdo_admin_notice()
490 {
491 if ((!get_option('vdo_client_key') || strlen(get_option('vdo_client_key')) != 64)
492 && basename($_SERVER['PHP_SELF']) == "plugins.php"
493 ) {
494 ?>
495 <div class="error">
496 <p>
497 The VdoCipher plugin is not ready.
498 <a href="options-general.php?page=vdocipher">Click here to configure</a>
499 </p>
500 </div>
501 <?php
502 }
503 }
504 add_action('admin_notices', 'vdo_admin_notice');
505