PluginProbe
VdoCipher: Secure Video Player and Hosting / 1.27
VdoCipher: Secure Video Player and Hosting v1.27
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.27, at vdocipher.php

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