PluginProbe
VdoCipher: Secure Video Player and Hosting / 1.24
VdoCipher: Secure Video Player and Hosting v1.24
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 +343 -157 1.51.24 View file →
@@ -1,190 +1,376 @@
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.5
6 + * Version: 1.24
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 -
13 12 if (__FILE__ == $_SERVER['SCRIPT_FILENAME']) {
14 13 header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
15 - exit("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\r\n<html><head>\r\n<title>404 Not Found</title>\r\n</head><body>\r\n<h1>Not Found</h1>\r\n<p>The requested URL " . $_SERVER['SCRIPT_NAME'] . " was not found on this server.</p>\r\n</body></html>");
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>");
16 17 }
17 18
18 -function vdo_send($action, $params, $posts = false){
19 - $client_key = get_option('vdo_client_key');
20 - if ($client_key == false || $client_key == "") {
21 - return "Plugin not configured. Please set the key to embed videos.";
22 - }
23 - $curl = curl_init();
24 - curl_setopt($curl, CURLOPT_FAILONERROR, true);
25 - curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
26 - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
27 - curl_setopt($curl, CURLOPT_VERBOSE, true);
28 - curl_setopt($curl, CURLOPT_FAILONERROR, false);
29 - //curl_setopt($curl, CURLOPT_PROXY, "xxxxxxxxxxxxxxxxx:xxxx");
19 +// Function called to retrieve id for when title given, starts
20 +function vdo_retrieve_id($title) {
21 + $client_key = get_option('vdo_client_key');
22 + if ($client_key == false || $client_key == "") {
23 + return "Plugin not configured. Please set the API key to embed videos.";
24 + }
25 + $url = "https://dev.vdocipher.com/api/videos?q=$title";
26 + $headers = array(
27 + 'Authorization'=>'Apisecret '.$client_key,
28 + 'Content-Type'=>'application/json',
29 + 'Accept'=>'application/json'
30 + );
31 + $response = wp_remote_post($url, array(
32 + 'method' => 'GET',
33 + 'headers' => $headers
34 + ));
35 + if (is_wp_error($response)) {
36 + $error_message = $response->get_error_message();
37 + echo "VdoCipher: Something went wrong: $error_message";
38 + return "";
39 + }
40 + $video_json_response = $response['body'];
41 + $video_list_object = json_decode($video_json_response);
42 + $video_list = $video_list_object->rows;
43 + $video_object = $video_list[0];
44 + $video_id = $video_object->id;
45 + return $video_id;
46 +}
47 +// Function called to retrieve id for when title given, ends
30 48
31 - $getData = http_build_query($params);
32 - curl_setopt($curl, CURLOPT_POST, true);
33 - $postData = "clientSecretKey=$client_key";
34 - if ($posts) {
35 - $postData .= "&". $posts;
36 - }
37 - curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
38 - $url = "http://api.vdocipher.com/v2/$action/?$getData";
39 - curl_setopt($curl, CURLOPT_URL,$url);
40 - $html = curl_exec($curl);
41 - if (!$html) {
42 - echo curl_error($curl);
43 - }
44 - curl_close($curl);
45 - return $html;
49 +// Function called to get OTP, starts
50 +function vdo_otp($video, $otp_post_array = array()) {
51 + $client_key = get_option('vdo_client_key');
52 + if ($client_key == false || $client_key == "") {
53 + return "Plugin not configured. Please set the API key to embed videos.";
54 + }
55 + $url = "https://dev.vdocipher.com/api/videos/$video/otp";
56 + $headers = array(
57 + 'Authorization'=>'Apisecret '.$client_key,
58 + 'Content-Type'=>'application/json',
59 + 'Accept'=>'application/json'
60 + );
61 + $otp_post_json = json_encode($otp_post_array);
62 + $response = wp_remote_post($url, array(
63 + 'method' => 'POST',
64 + 'headers' => $headers,
65 + 'body' => $otp_post_json
66 + ));
67 + if (is_wp_error($response)) {
68 + $error_message = $response->get_error_message();
69 + echo "VdoCipher: Something went wrong: $error_message";
70 + return "";
71 + }
72 + $OTP_Response = $response['body'];
73 + return json_decode($OTP_Response);
46 74 }
47 -function vdo_shortcode( $atts ) {
48 - extract( shortcode_atts(
49 - array(
50 - 'title' => 'TITLE_OF_VIDEO',
51 - 'width' => get_option('vdo_default_width'),
52 - 'height' => get_option('vdo_default_height'),
53 - 'id' => 'id',
54 - 'no_annotate'=> false
55 - ), $atts )
56 - );
57 - if(!$atts['id']){
58 - if(!$atts['title'])
59 - return "Required argument id for embedded video not found.";
60 - $params = array(
61 - 'search'=>array(
62 - 'title'=>$title
63 - ),
64 - 'page'=>1,
65 - 'limit'=>30,
66 - 'type'=>'json'
67 - );
68 - $video = vdo_send("videos", $params);
69 - $video = json_decode($video);
70 - if($video == null)
71 - return "404. Video not found.";
72 - $video = $video[0]->id;
73 - if ($video == null) {
74 - return "No video with given title found.";
75 - }
76 - }
77 - else
78 - $video = $id;
75 +// Function called to get OTP, ends
79 76
80 - $params = array(
81 - 'video'=>$video
82 - );
83 - $anno = false;
84 - if (!function_exists("eval_date")) {
85 - function eval_date($matches){
86 - return date($matches[1]);
87 - }
88 - }
89 - if (get_option('vdo_annotate_code') != "") {
90 - $current_user = wp_get_current_user();
91 - $vdo_annotate_code = get_option('vdo_annotate_code');
92 - if (is_user_logged_in()) {
93 - $vdo_annotate_code = str_replace('{name}', $current_user->display_name , $vdo_annotate_code);
94 - $vdo_annotate_code = str_replace('{email}', $current_user->user_email , $vdo_annotate_code);
95 - $vdo_annotate_code = str_replace('{username}', $current_user->user_login , $vdo_annotate_code);
96 - $vdo_annotate_code = str_replace('{id}', $current_user->ID , $vdo_annotate_code);
97 - }
98 - $vdo_annotate_code = str_replace('{ip}', $_SERVER['REMOTE_ADDR'] , $vdo_annotate_code);
99 - $vdo_annotate_code = preg_replace_callback('/\{date\.([^\}]+)\}/', "eval_date" , $vdo_annotate_code);
100 - if(!$no_annotate)
101 - $anno = "annotate=". urlencode($vdo_annotate_code);
102 - }
103 - $OTP = vdo_send("otp", $params, $anno);
104 - $OTP = json_decode($OTP);
105 - if(is_null($OTP)){
106 - $output = "<span id='vdo$OTP' style='background:#555555;color:#FFFFFF'><h4>Video not found</h4></span>";
107 - return $output;
108 - }
109 - $OTP = $OTP->otp;
77 +// VdoCipher Shortcode starts
78 +function vdo_shortcode($atts)
79 +{
80 + extract(shortcode_atts(
81 + array(
82 + 'title' => 'TITLE_OF_VIDEO',
83 + 'width' => get_option('vdo_default_width') . "px",
84 + 'height' => get_option('vdo_default_height') . "px",
85 + 'id' => 'id',
86 + 'no_annotate'=> false,
87 + 'version'=> 0,
88 + 'vdo_theme'=> false,
89 + 'player_tech'=> ''
90 + ),
91 + $atts
92 + ));
93 + if ((get_option('vdo_default_height')) == 'auto') {
94 + $height = 'auto';
95 + }
96 + if (!$atts['id']) {
97 + if (!$atts['title']) {
98 + return "Required argument id for embedded video not found.";
99 + }
100 + else {
101 + $video = vdo_retrieve_id($title);
102 + if ($video == null) {
103 + return "404. Video not found.";
104 + }
105 + }
106 + }
107 + else {
108 + $video = $id;
109 + }
110 110
111 - $output = "<span id='vdo$OTP'></span>";
112 - $output .= "<script src='https://de122v0opjemw.cloudfront.net/utils/playerInit.php?otp=$OTP&height=$height&width=$width&'></script>";
113 - return $output;
114 -}
111 + // Initialize $otp_post_array, to be sent as part of OTP request, as for time-to-live 300
112 + $otp_post_array = array("ttl" => 300);
113 + if (!function_exists("eval_date")) {
114 + function eval_date($matches)
115 + {
116 + return current_time($matches[1]);
117 + }
118 + }
119 + if (get_option('vdo_annotate_code') != "") {
120 + $current_user = wp_get_current_user();
121 + $vdo_annotate_code = get_option('vdo_annotate_code');
122 + $vdo_annotate_code = apply_filters('vdocipher_annotate_preprocess', $vdo_annotate_code);
123 + if (is_user_logged_in()) {
124 + $vdo_annotate_code = str_replace('{name}', $current_user->display_name, $vdo_annotate_code);
125 + $vdo_annotate_code = str_replace('{email}', $current_user->user_email, $vdo_annotate_code);
126 + $vdo_annotate_code = str_replace('{username}', $current_user->user_login, $vdo_annotate_code);
127 + $vdo_annotate_code = str_replace('{id}', $current_user->ID, $vdo_annotate_code);
128 + }
129 + $vdo_annotate_code = str_replace('{ip}', $_SERVER['REMOTE_ADDR'], $vdo_annotate_code);
130 + $vdo_annotate_code = preg_replace_callback('/\{date\.([^\}]+)\}/', "eval_date", $vdo_annotate_code);
131 + $vdo_annotate_code = apply_filters('vdocipher_annotate_postprocess', $vdo_annotate_code);
132 + // Add annotate code to $otp_post_array, which will be converted to Json and then sent as POST body to API endpoint
133 + if (!$no_annotate) {
134 + $otp_post_array["annotate"] = $vdo_annotate_code;
135 + }
136 + }
137 + // OTP is requested via vdo_otp function
138 + $OTP_Response = vdo_otp($video, $otp_post_array);
139 + $OTP = $OTP_Response->otp;
140 + $playbackInfo = $OTP_Response->playbackInfo;
115 141
116 -add_shortcode( 'vdo', 'vdo_shortcode' );
142 + if (is_null($OTP)) {
117 143
144 + $output = "<span id='vdo$OTP' style='background:#555555;color:#FFFFFF'><h4>Video not found</h4></span>";
145 + return $output;
146 + }
118 147
119 -/// adding the settings link
120 -$plugin = plugin_basename(__FILE__);
121 -add_filter("plugin_action_links_$plugin", 'vdo_settings_link' );
148 + // Version, legacy, for flash only
149 + $version = 0;
150 + if (isset($atts['version'])) {
151 + $version = $atts['version'];
152 + }
122 153
123 -function vdo_settings_link($links) {
124 - $settings_link = '<a href="options-general.php?page=vdocipher.php">Settings</a>';
125 - array_unshift($links, $settings_link);
126 - return $links;
154 + // Video Embed version is updated
155 + if ((get_option('vdo_embed_version')) == false) {
156 + update_option('vdo_embed_version', '1.6.4');
157 + }
158 + $vdo_embed_version_str = get_option('vdo_embed_version');
159 +
160 + // Video Player theme, update and as shortcode attribute
161 + if ((get_option('vdo_player_theme')) == false) {
162 + update_option('vdo_player_theme', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
163 + }
164 + if(!$vdo_theme){
165 + $vdo_player_theme = get_option('vdo_player_theme');
166 + }
167 + else {
168 + $vdo_player_theme = $vdo_theme;
169 + }
170 +
171 + // tech override custom names
172 + switch ($player_tech) {
173 + case "flash":
174 + $player_tech = "*,-dash";
175 + break;
176 + case "nohtml5":
177 + $player_tech = "*,-dash";
178 + break;
179 + case "noflash":
180 + $player_tech = "*,-hss";
181 + break;
182 + case "nozen":
183 + $player_tech = "*,-zen";
184 + break;
185 + case "noios":
186 + $player_tech = "*,-hlse";
187 + break;
188 + default:
189 + break;
190 + }
191 +
192 + // Old Embed Code
193 + if ($vdo_embed_version_str === '0.5') {
194 + $output = "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
195 + $output .= "<script> (function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){".
196 + " (v[o].d=v[o].d||[]).push(a);};";
197 + $output .= "if(!v[o].l) { v[o].l=1*new Date();a=i.createElement(d),m=i.getElementsByTagName(d)[0];a.async=1;".
198 + "a.src=e; m.parentNode.insertBefore(a,m);}";
199 + $output .= " })(window,document,'script','//de122v0opjemw.cloudfront.net/vdo.js','vdo'); vdo.add({ ";
200 + $output .= "o: '$OTP', ";
201 + if ($version == 32) {
202 + $output .= "version: '$version' ";
203 + }
204 + $output .= "}); </script>";
205 + } else {
206 + //New embed code
207 + if ($player_tech === '') {
208 + if (get_option('vdo_watermark_flash_html') === 'flash') {
209 + $player_tech = "*,-dash";
210 + }
211 + }
212 + $output .= "<div id='vdo$OTP' style='height:$height;width:$width;max-width:100%' ></div>";
213 + $output .= "<script>(function(v,i,d,e,o){v[o]=v[o]||{}; v[o].add = v[o].add || function V(a){".
214 + "(v[o].d=v[o].d||[]).push(a);};";
215 + $output .= "if(!v[o].l) { v[o].l=1*new Date(); a=i.createElement(d), m=i.getElementsByTagName(d)[0];";
216 + $output .= "a.async=1; a.src=e; m.parentNode.insertBefore(a,m);}";
217 + $output .= "})(window,document,'script','https://d1z78r8i505acl.cloudfront.net/playerAssets/";
218 + $output .= "$vdo_embed_version_str";
219 + $output .= "/vdo.js','vdo');";
220 + $output .= "vdo.add({";
221 + $output .= "otp: '$OTP',";
222 + $output .= "playbackInfo: '$playbackInfo',";
223 + $output .= "theme: '$vdo_player_theme',";
224 + if ($player_tech !== '') {
225 + $output .= "techoverride: [" ;
226 + $techarray = explode(',', $player_tech);
227 + for ($i = 0; $i < sizeof($techarray); $i++) {
228 + $techStr = $techarray[$i];
229 + $output .= "'$techStr'";
230 + if ($i !== sizeof($techarray)-1) {
231 + $output .= ", ";
232 + }
233 + }
234 + $output .= "],";
235 + }
236 + $output .= "container: document.querySelector('#vdo$OTP'),});";
237 + $output .= "</script>";
238 + }
239 + return $output;
127 240 }
241 +add_shortcode('vdo', 'vdo_shortcode');
242 +// VdoCipher Shortcode ends
128 243
244 +// adding the Settings link, starts
245 +$plugin = plugin_basename(__FILE__);
246 +add_filter("plugin_action_links_$plugin", 'vdo_settings_link');
129 247
130 -/// add the menu item and register settings
131 -if ( is_admin() ){ // admin actions
132 - add_action( 'admin_menu', 'vdo_menu' );
133 - add_action( 'admin_init', 'register_vdo_settings' );
248 +function vdo_settings_link($links)
249 +{
250 + $settings_link = '<a href="options-general.php?page=vdocipher">Settings</a>';
251 + array_unshift($links, $settings_link);
252 + return $links;
253 +}
254 +// adding the Settings link, ends
255 +
256 +// add the menu item and register settings (3 functions), starts
257 +if (is_admin()) { // admin actions
258 + add_action('admin_init', 'register_vdo_settings');
259 + add_action('admin_menu', 'vdo_menu');
134 260 } else {
135 - // non-admin enqueues, actions, and filters
261 + // non-admin enqueues, actions, and filters
136 262 }
137 -function vdo_menu(){
138 - add_options_page( 'VdoCipher Options', 'VdoCipher', 'manage_options', 'vdocipher', 'vdo_options' );
263 +function vdo_menu() {
264 + add_menu_page(
265 + 'VdoCipher Options',
266 + 'VdoCipher',
267 + 'manage_options',
268 + 'vdocipher',
269 + 'vdo_options',
270 + plugin_dir_url(__FILE__).'images/logo.png'
271 + );
272 + add_submenu_page(
273 + null,
274 + 'Video Player Themes',
275 + 'CustomPlayer',
276 + 'manage_options',
277 + 'themesvdo',
278 + 'themesvdo'
279 + );
139 280 }
140 -function vdo_options(){
141 - if (!get_option('vdo_default_height'))
142 - update_option('vdo_default_height', '360');
143 - if (!get_option('vdo_default_width'))
144 - update_option('vdo_default_width', '640');
145 - $vdo_client_key = get_option('vdo_client_key');
146 - if (!$vdo_client_key && strlen($vdo_client_key) != 64) {
147 - vdo_show_form_client_key();
148 - return "";
149 - }
150 - if ( !current_user_can( 'manage_options' ) ) {
151 - wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
152 - }
153 - include('include/options.php');
281 +
282 +function themesvdo() {
283 + include('include/player_themes.php');
154 284 }
155 -function register_vdo_settings() { // whitelist options
156 - register_setting( 'vdo_option-group', 'vdo_client_key' );
157 - register_setting( 'vdo_option-group', 'vdo_default_height' );
158 - register_setting( 'vdo_option-group', 'vdo_default_width' );
159 - register_setting( 'vdo_option-group', 'vdo_annotate_code' );
285 +
286 +function vdo_options()
287 +{
288 + if (!get_option('vdo_default_height')) {
289 + update_option('vdo_default_height', 'auto');
290 + }
291 + if (!get_option('vdo_default_width')) {
292 + update_option('vdo_default_width', '1280');
293 + }
294 + $vdo_client_key = get_option('vdo_client_key');
295 + if (!$vdo_client_key && strlen($vdo_client_key) != 64) {
296 + vdo_show_form_client_key();
297 + return "";
298 + }
299 + if (!current_user_can('manage_options')) {
300 + wp_die(__('You do not have sufficient permissions to access this page.'));
301 + }
302 + include('include/options.php');
160 303 }
304 +function register_vdo_settings()
305 +{
306 + // whitelist options
307 + register_setting('vdo_option-group', 'vdo_client_key');
308 + register_setting('vdo_option-group', 'vdo_default_height');
309 + register_setting('vdo_option-group', 'vdo_default_width');
310 + register_setting('vdo_option-group', 'vdo_annotate_code');
311 + register_setting('vdo_option-group', 'vdo_embed_version');
312 + register_setting('vdo_option-group', 'vdo_player_theme');
313 + register_setting('vdo_option-group', 'vdo_watermark_flash_html');
314 + register_setting('vdo_custom_theme', 'vdo_player_theme_options');
315 +}
316 +// add the menu item and register settings (3 functions), ends
161 317
162 -/// adding a section for asking for the client key
163 -function vdo_show_form_client_key(){
164 - include('include/setting_form.php');
318 +// section for client key for new users
319 +function vdo_show_form_client_key()
320 +{
321 + include('include/setting_form.php');
165 322 }
166 -register_deactivation_hook(__FILE__, 'vdo_deactivate');
167 -function vdo_deactivate(){
168 - delete_option( 'vdo_client_key' );
169 - delete_option('vdo_default_width');
170 - delete_option('vdo_default_height');
171 - delete_option('vdo_annotate_code');
323 +
324 +// Activation Hook starts
325 +function vdo_activate()
326 +{
327 + if ((get_option('vdo_default_height')) == false) {
328 + update_option('vdo_default_height', 'auto');
329 + }
330 + if ((get_option('vdo_default_width')) == false) {
331 + update_option('vdo_default_width', '1280');
332 + }
333 + //https://stackoverflow.com/a/2173318/5022684
334 + if ((get_option('vdo_embed_version')) == false) {
335 + update_option('vdo_embed_version', '1.6.4');
336 + }
337 + if ((get_option('vdo_player_theme')) == false) {
338 + update_option('vdo_player_theme', '9ae8bbe8dd964ddc9bdb932cca1cb59a');
339 + }
340 + if ((get_option('vdo_watermark_flash_html')) == false) {
341 + update_option('vdo_watermark_flash_html', 'html5');
342 + }
172 343 }
173 -function vdo_activate() {
174 - if (!get_option('vdo_default_height'))
175 - update_option('vdo_default_height', '400');
176 - if (!get_option('vdo_default_width'))
177 - update_option('vdo_default_width', '640');
344 +register_activation_hook(__FILE__, 'vdo_activate');
345 +
346 +// Deactivation Hook starts
347 +function vdo_deactivate()
348 +{
349 + delete_option('vdo_client_key');
350 + delete_option('vdo_default_width');
351 + delete_option('vdo_default_height');
352 + delete_option('vdo_annotate_code');
353 + delete_option('vdo_embed_version');
354 + delete_option('vdo_player_theme');
355 + delete_option('vdo_watermark_flash_html');
356 + delete_option('vdo_player_theme_options');
178 357 }
179 -register_activation_hook( __FILE__, 'vdo_activate' );
180 -function vdo_admin_notice() {
181 - if((!get_option('vdo_client_key') || strlen(get_option('vdo_client_key')) != 64) && basename($_SERVER['PHP_SELF']) == "plugins.php" ){
182 - ?>
183 - <div class="error">
184 - <p>The VdoCipher plugin is not ready. <a href="options-general.php?page=vdocipher">Click here to configure</a>
185 - </p>
186 - </div>
187 - <?php
188 - }
358 +register_deactivation_hook(__FILE__, 'vdo_deactivate');
359 +
360 +// Admin notice to configure plugin for new installs, starts
361 +function vdo_admin_notice()
362 +{
363 + if ((!get_option('vdo_client_key') || strlen(get_option('vdo_client_key')) != 64)
364 + && basename($_SERVER['PHP_SELF']) == "plugins.php"
365 + ) {
366 + ?>
367 + <div class="error">
368 + <p>
369 + The VdoCipher plugin is not ready.
370 + <a href="options-general.php?page=vdocipher">Click here to configure</a>
371 + </p>
372 + </div>
373 + <?php
374 + }
189 375 }
190 -add_action( 'admin_notices', 'vdo_admin_notice' );
376 +add_action('admin_notices', 'vdo_admin_notice');