Insert Post Ads - Version 1.3.2

Version Description

  • GDPR consent management module added
  • Updated Privacy policy
Download this release

Release Info

Developer insertpostads
Plugin Icon 128x128 Insert Post Ads
Version 1.3.2
Comparing to
See all releases

Code changes from version 1.3.1 to 1.3.2

apis/vi/api.php CHANGED
@@ -6,6 +6,7 @@ function insert_ads_vi_api_get_settings() {
6
  $response = wp_remote_get('https://dashboard-api.vidint.net/v1/api/widget/settings', array('timeout' => 15));
7
  if(!is_wp_error($response) && (200 == wp_remote_retrieve_response_code($response))) {
8
  $responseBody = json_decode($response['body']);
 
9
  if((json_last_error() == JSON_ERROR_NONE) && ($responseBody->status == 'ok')) {
10
  $viSettings = array(
11
  'signupURL' => $responseBody->data->signupURL,
@@ -17,7 +18,10 @@ function insert_ads_vi_api_get_settings() {
17
  'revenueAPI' => $responseBody->data->revenueAPI,
18
  'adsTxtAPI' => $responseBody->data->adsTxtAPI,
19
  'languages' => $responseBody->data->languages,
20
- 'jsTagAPI' => $responseBody->data->jsTagAPI,
 
 
 
21
  );
22
  delete_transient('insert_ads_vi_api_settings');
23
  set_transient('insert_ads_vi_api_settings', $viSettings, WEEK_IN_SECONDS);
@@ -32,6 +36,73 @@ function insert_ads_vi_api_get_settings() {
32
  return $viSettings;
33
  }
34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  function insert_ads_vi_api_get_signupurl() {
36
  $viSettings = insert_ads_vi_api_get_settings();
37
  if(($viSettings != false) && is_array($viSettings)) {
6
  $response = wp_remote_get('https://dashboard-api.vidint.net/v1/api/widget/settings', array('timeout' => 15));
7
  if(!is_wp_error($response) && (200 == wp_remote_retrieve_response_code($response))) {
8
  $responseBody = json_decode($response['body']);
9
+ //echo '<pre>'; print_r($responseBody->data); echo '</pre>';
10
  if((json_last_error() == JSON_ERROR_NONE) && ($responseBody->status == 'ok')) {
11
  $viSettings = array(
12
  'signupURL' => $responseBody->data->signupURL,
18
  'revenueAPI' => $responseBody->data->revenueAPI,
19
  'adsTxtAPI' => $responseBody->data->adsTxtAPI,
20
  'languages' => $responseBody->data->languages,
21
+ 'jsTagAPI' => $responseBody->data->jsTagAPI,
22
+ 'vendorListURL' => $responseBody->data->vendorListURL,
23
+ 'vendorListVersion' => $responseBody->data->vendorListVersion,
24
+ 'consentPopupContent' => $responseBody->data->consentPopupContent
25
  );
26
  delete_transient('insert_ads_vi_api_settings');
27
  set_transient('insert_ads_vi_api_settings', $viSettings, WEEK_IN_SECONDS);
36
  return $viSettings;
37
  }
38
 
39
+ function insert_ads_vi_api_get_consent_purposes() {
40
+ $viSettings = insert_ads_vi_api_get_settings();
41
+ if(($viSettings != false) && is_array($viSettings)) {
42
+ return $viSettings['purposes'];
43
+ }
44
+ return false;
45
+ }
46
+
47
+ function insert_ads_vi_api_get_consent_popup_content() {
48
+ $viSettings = insert_ads_vi_api_get_settings();
49
+ if(($viSettings != false) && is_array($viSettings)) {
50
+ return $viSettings['consentPopupContent'];
51
+ }
52
+ return false;
53
+ }
54
+
55
+ function insert_ads_vi_api_get_vendor_list_version() {
56
+ $viSettings = insert_ads_vi_api_get_settings();
57
+ if(($viSettings != false) && is_array($viSettings)) {
58
+ return $viSettings['vendorListVersion'];
59
+ }
60
+ return false;
61
+ }
62
+
63
+ function insert_ads_vi_api_is_eu() {
64
+ //$userIp = $_SERVER["REMOTE_ADDR"];
65
+ $userIp = '185.216.33.82';
66
+ $isEU = get_transient('insert_ads_vi_api_is_eu_'.$userIp);
67
+ if($isEU === false) {
68
+ try{
69
+ $response = wp_remote_get(
70
+ 'http://gdpr-check.net/gdpr/is-eu?ip='.$userIp,
71
+ array('timeout' => 15)
72
+ );
73
+ if(!is_wp_error($response)) {
74
+ if(200 == wp_remote_retrieve_response_code($response)) {
75
+ $responseBody = json_decode($response['body']);
76
+ if((json_last_error() == JSON_ERROR_NONE)) {
77
+ if((isset($responseBody->is_eu)) && ($responseBody->is_eu == '1')) {
78
+ delete_transient('insert_ads_vi_api_is_eu_'.$userIp);
79
+ set_transient('insert_ads_vi_api_is_eu_'.$userIp, '1', WEEK_IN_SECONDS);
80
+ return true;
81
+ } else {
82
+ delete_transient('insert_ads_vi_api_is_eu_'.$userIp);
83
+ set_transient('insert_ads_vi_api_is_eu_'.$userIp, '0', WEEK_IN_SECONDS);
84
+ return false;
85
+ }
86
+ } else {
87
+ return false;
88
+ }
89
+ } else {
90
+ return false;
91
+ }
92
+ }
93
+ } catch(Exception $ex) {
94
+ return false;
95
+ }
96
+ } else {
97
+ if($isEU == '1') {
98
+ return true;
99
+ } else {
100
+ return false;
101
+ }
102
+
103
+ }
104
+ }
105
+
106
  function insert_ads_vi_api_get_signupurl() {
107
  $viSettings = insert_ads_vi_api_get_settings();
108
  if(($viSettings != false) && is_array($viSettings)) {
css/admin.css CHANGED
@@ -86,7 +86,7 @@ div[aria-describedby="insert_ads_vi_signup_dialog"] .ui-dialog-titlebar button{
86
  padding: 0px 55px;
87
  font-size: 13px;
88
  position: absolute;
89
- bottom: -65px;
90
  line-height: 32px;
91
  font-weight: bold;
92
  left: -30px;
@@ -329,3 +329,17 @@ body.post-new-php.post-type-insertpostads #title{
329
  }.insert_ads_popup_content_wrapper + .insert_ads_popup_content_wrapper{
330
  display:none;
331
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  padding: 0px 55px;
87
  font-size: 13px;
88
  position: absolute;
89
+ bottom: -220px;
90
  line-height: 32px;
91
  font-weight: bold;
92
  left: -30px;
329
  }.insert_ads_popup_content_wrapper + .insert_ads_popup_content_wrapper{
330
  display:none;
331
  }
332
+ #insert_ads_vi_code_settings_show_gdpr_authorization + label{
333
+ background: #C8161B !important;
334
+ border: 2px solid #000 !important;
335
+ color: #fff !important;
336
+ display: block;
337
+ font-weight: bold !important;
338
+ height: 30px;
339
+ margin: 15px auto 0;
340
+ text-shadow: 1px 1px 5px #000;
341
+ width: 80%;
342
+ }
343
+ #insert_ads_vi_code_settings_show_gdpr_authorization + label.ui-state-active {
344
+ background: #6ddc5f !important;
345
+ }
css/gdpr.css ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #insert_ads_vi_consent_popup_overlay {
2
+ position: fixed;
3
+ left: 0;
4
+ right: 0;
5
+ top: 0;
6
+ bottom: 0;
7
+ background: rgba(0,0,0,0.5);
8
+ z-index: 10000;
9
+ }
10
+
11
+ #insert_ads_vi_consent_popup_wrapper {
12
+ max-width: 480px;
13
+ background: rgba(255,255,255,0.9);
14
+ padding: 30px 30px 30px;
15
+ position: fixed;
16
+ right: 0;
17
+ bottom: 0;
18
+ color: #000;
19
+ z-index: 10001;
20
+ }
21
+
22
+ #insert_ads_vi_consent_popup_wrapper h1 {
23
+ line-height: 42px;
24
+ font-weight: 400;
25
+ font-family: sans-serif,Helvetica,Arial;
26
+ font-size: 36px;
27
+ text-align: center;
28
+ margin: 0;
29
+ padding: 0;
30
+ border: none;
31
+ background: none;
32
+ color: #000;
33
+ }
34
+
35
+ #insert_ads_vi_consent_popup_wrapper p {
36
+ font-size: 14px;
37
+ font-family: sans-serif,Helvetica,Arial;
38
+ line-height: 20px;
39
+ margin: 10px 0 30px;
40
+ padding: 0;
41
+ border: none;
42
+ background: none;
43
+ color: #000;
44
+ text-align: justify;
45
+ font-weight: 400;
46
+ }
47
+
48
+ #insert_ads_vi_consent_popup_wrapper p a,
49
+ #insert_ads_vi_consent_popup_wrapper p a:hover {
50
+ font-size: 14px;
51
+ font-family: sans-serif,Helvetica,Arial;
52
+ line-height: 20px;
53
+ margin: 0;
54
+ padding: 0;
55
+ border: none;
56
+ background: none;
57
+ color: #000;
58
+ text-decoration: underline;
59
+ }
60
+
61
+ #insert_ads_vi_consent_popup_wrapper #insert_ads_vi_consent_popup_actions_wrapper {
62
+ text-align: center;
63
+ margin: 0 0 30px;
64
+ }
65
+
66
+ #insert_ads_vi_consent_popup_wrapper #insert_ads_vi_consent_popup_actions_wrapper #insert_ads_vi_consent_popup_disagree_btn,
67
+ #insert_ads_vi_consent_popup_wrapper #insert_ads_vi_consent_popup_actions_wrapper #insert_ads_vi_consent_popup_disagree_btn:hover {
68
+ cursor: pointer;
69
+ color: #000;
70
+ background: none;
71
+ border: none;
72
+ padding: 10px 30px;
73
+ text-align: center;
74
+ font-weight: 600;
75
+ font-size: 15px;
76
+ font-family: sans-serif,Helvetica,Arial;
77
+ margin: 0;
78
+ }
79
+
80
+ #insert_ads_vi_consent_popup_wrapper #insert_ads_vi_consent_popup_actions_wrapper #insert_ads_vi_consent_popup_agree_btn,
81
+ #insert_ads_vi_consent_popup_wrapper #insert_ads_vi_consent_popup_actions_wrapper #insert_ads_vi_consent_popup_agree_btn:hover {
82
+ cursor: pointer;
83
+ color: #000;
84
+ background: rgba(255, 242, 0, 1);
85
+ border: 2px solid rgba(255, 242, 0, 1);
86
+ padding: 10px 60px;
87
+ text-align: center;
88
+ font-weight: 600;
89
+ font-size: 15px;
90
+ font-family: sans-serif,Helvetica,Arial;
91
+ border-radius: 18px;
92
+ margin: 0;
93
+ }
94
+
95
+ #insert_ads_vi_consent_popup_wrapper #insert_ads_vi_consent_popup_links_wrapper {
96
+ text-align: center;
97
+ }
98
+
99
+ #insert_ads_vi_consent_popup_wrapper #insert_ads_vi_consent_popup_links_wrapper a,
100
+ #insert_ads_vi_consent_popup_wrapper #insert_ads_vi_consent_popup_links_wrapper a:hover {
101
+ color: #000;
102
+ background: none;
103
+ border: none;
104
+ padding: 10px;
105
+ text-align: center;
106
+ font-weight: 400;
107
+ font-size: 12px;
108
+ font-family: sans-serif,Helvetica,Arial;
109
+ margin: 0;
110
+ text-decoration: underline;
111
+ line-height: 24px;
112
+ }
113
+
114
+ #insert_ads_vi_consent_popup_settings_button {
115
+ font-size: 13px;
116
+ color: rgba(146, 135, 131, 1);
117
+ background: url(../images/privacy.png) no-repeat left center;
118
+ padding: 0 0 0 32px;
119
+ position: fixed;
120
+ bottom: 10px;
121
+ right: 10px;
122
+ cursor: pointer;
123
+ z-index: 10002;
124
+ font-family: sans-serif,Helvetica,Arial;
125
+ -webkit-touch-callout: none; /* iOS Safari */
126
+ -webkit-user-select: none; /* Safari */
127
+ -khtml-user-select: none; /* Konqueror HTML */
128
+ -moz-user-select: none; /* Firefox */
129
+ -ms-user-select: none; /* Internet Explorer/Edge */
130
+ user-select: none; /* Non-prefixed version, currently supported by Chrome and Opera */
131
+ }
images/privacy.png ADDED
Binary file
includes/gdpr.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /* Begin Consent Popup */
3
+ add_action('init', 'insert_ads_vi_gdpr_popup_init');
4
+ function insert_ads_vi_gdpr_popup_init() {
5
+ $vicodeSettings = get_option('insert_ads_vi_code_settings');
6
+ if(isset($vicodeSettings['show_gdpr_authorization']) && wp_validate_boolean($vicodeSettings['show_gdpr_authorization']) ) {
7
+ add_action('wp_enqueue_scripts', 'insert_ads_vi_gdpr_popup_wp_enqueue_style');
8
+ add_action('wp_enqueue_scripts', 'insert_ads_vi_gdpr_popup_wp_enqueue_scripts');
9
+ add_action('wp_footer', 'insert_ads_vi_gdpr_popup_wp_footer');
10
+ }
11
+ }
12
+
13
+ function insert_ads_vi_gdpr_popup_wp_enqueue_style() {
14
+ wp_enqueue_style('insert_ads_vi_gdpr', '/wp-content/plugins/insert-post-ads/css/gdpr.css');
15
+ }
16
+
17
+
18
+ function insert_ads_vi_gdpr_popup_wp_enqueue_scripts() {
19
+ wp_enqueue_script('insert_ads_vi_gdpr', '/wp-content/plugins/insert-post-ads/js/gdpr.js');
20
+ }
21
+
22
+ function insert_ads_vi_gdpr_popup_wp_footer() {
23
+ $showViConsent = true;
24
+ $isEU = insert_ads_vi_api_is_eu();
25
+ if(isset($_COOKIE['Viconsent'])) {
26
+ $showViConsent = false;
27
+ }
28
+ $vicodeSettings = get_option('insert_ads_vi_code_settings');
29
+ $labels = array();
30
+ $viConsentPopupContent = insert_ads_vi_api_get_consent_popup_content();
31
+ if($viConsentPopupContent != false) {
32
+ switch($vicodeSettings['language']) {
33
+ case 'de-de':
34
+ $labels['popupContent'] = $viConsentPopupContent->es;
35
+ $labels['accept'] = 'acepto';
36
+ $labels['donotaccept'] = 'no acepto';
37
+ $labels['showPurposes'] = 'Mostrar propósitos';
38
+ $labels['showVendors'] = 'Mostrar vendedores';
39
+
40
+ break;
41
+ case 'fr-fr':
42
+ $labels['popupContent'] = $viConsentPopupContent->fr;
43
+ $labels['accept'] = 'J’accepte';
44
+ $labels['donotaccept'] = 'Je n’accepte pas';
45
+ $labels['showPurposes'] = 'Plus de details';
46
+ $labels['showVendors'] = 'Montrez les vendeurs';
47
+ break;
48
+ case 'en-us':
49
+ default:
50
+ $labels['popupContent'] = $viConsentPopupContent->en;
51
+ $labels['accept'] = 'I accept';
52
+ $labels['donotaccept'] = 'I do not accept';
53
+ $labels['showPurposes'] = 'Show purposes';
54
+ $labels['showVendors'] = 'Show vendors';
55
+ break;
56
+ }
57
+ }
58
+
59
+ echo '<div id="insert_ads_vi_consent_popup_wrapper" style="display: none;">';
60
+ echo $labels['popupContent'];
61
+ echo '<div id="insert_ads_vi_consent_popup_actions_wrapper">';
62
+ echo '<input id="insert_ads_vi_consent_popup_disagree_btn" type="button" value="'.$labels['donotaccept'].'" onclick="insert_ads_vi_consent_popup_disagree()" />';
63
+ echo '<input id="insert_ads_vi_consent_popup_agree_btn" type="button" value="'.$labels['accept'].'" onclick="insert_ads_vi_consent_popup_agree()" />';
64
+ echo '</div>';
65
+ echo '<div id="insert_ads_vi_consent_popup_links_wrapper">';
66
+ echo '<a href="https://www.vi.ai/purposes" target="_blank">'.$labels['showPurposes'].'</a>';
67
+ echo '<a href="https://www.vi.ai/vendors" target="_blank">'.$labels['showVendors'].'</a>';
68
+ echo '</div>';
69
+ echo '<input id="insert_ads_vi_consent_popup_is_eu" type="hidden" value="'.$isEU.'" />';
70
+ echo '<input id="insert_ads_vi_consent_popup_url" type="hidden" value="'.get_bloginfo('url').'" />';
71
+ echo '<input id="insert_ads_vi_consent_popup_auth" type="hidden" value="'.wp_create_nonce('insert_ads_vi_consent').'" />';
72
+ echo '<input id="insert_ads_vi_consent_popup_vendor_list_version" type="hidden" value="'.insert_ads_vi_api_get_vendor_list_version().'" />';
73
+ $purposesBinary = '000000000000000000000000';
74
+ $purposes = insert_ads_vi_api_get_consent_purposes();
75
+ if(isset($purposes) && (count($purposes) > 0)) {
76
+ foreach($purposes as $purpose) {
77
+ $purposesBinary = substr_replace($purposesBinary, '1', ((24 - (int)$purpose->id) + 1), 1);
78
+ }
79
+ }
80
+ echo '<input id="insert_ads_vi_consent_popup_vendor_list_purposes" type="hidden" value="'.$purposesBinary.'" />';
81
+ echo '<input id="insert_ads_vi_consent_popup_vendor_list_vendors" type="hidden" value="999" />';
82
+ echo '</div>';
83
+ echo '<div id="insert_ads_vi_consent_popup_overlay" style="display: none;"></div>';
84
+ echo '<span id="insert_ads_vi_consent_popup_settings_button" onclick="insert_ads_vi_consent_popup_settings()" unselectable="on" style="display: none;">Privacy settings</span>';
85
+ }
86
+ /* End Consent Popup */
87
+
88
+ /* Begin Data Storage */
89
+ add_action('init', 'insert_ads_vi_gdpr_data_init');
90
+ function insert_ads_vi_gdpr_data_init() {
91
+ if(isset($_GET['insert_ads_vi_consent']) && ($_GET['insert_ads_vi_consent'] != '')) {
92
+ check_ajax_referer('insert_ads_vi_consent', 'insert_ads_vi_consent');
93
+ wp_insert_post(array(
94
+ 'post_title' => date('c'),
95
+ 'post_content' => ((isset($_COOKIE['Viconsent']))?$_COOKIE['Viconsent']:''),
96
+ 'post_status' => 'publish',
97
+ 'post_type' => 'viconsent',
98
+ ));
99
+ die();
100
+ }
101
+
102
+
103
+ $labels = array(
104
+ 'name' => 'VI Consent',
105
+ 'singular_name' => 'VI Consent',
106
+ 'add_new' => 'Add New',
107
+ 'add_new_item' => 'Add New VI Consent',
108
+ 'edit_item' => 'Edit VI Consent',
109
+ 'new_item' => 'New VI Consent',
110
+ 'view_item' => 'View VI Consent',
111
+ 'search_items' => 'Search VI Consent',
112
+ 'not_found' => 'No VI Consent found',
113
+ 'not_found_in_trash' => 'No VI Consent found in Trash',
114
+ 'parent_item_colon' => 'Parent VI Consent:',
115
+ 'menu_name' => 'VI Consent',
116
+ );
117
+
118
+ $args = array(
119
+ 'labels' => $labels,
120
+ 'hierarchical' => false,
121
+ 'description' => 'VI Consent',
122
+ 'supports' => array('title', 'editor'),
123
+ 'public' => false,
124
+ 'show_ui' => true,
125
+ 'show_in_menu' => false,
126
+ 'show_in_nav_menus' => false,
127
+ 'publicly_queryable' => false,
128
+ 'exclude_from_search' => true,
129
+ 'has_archive' => false,
130
+ 'query_var' => false,
131
+ 'can_export' => true,
132
+ 'rewrite' => false,
133
+ 'capability_type' => 'post'
134
+ );
135
+
136
+ register_post_type('viconsent', $args);
137
+ }
138
+
139
+ add_filter('user_can_richedit', 'insert_ads_vi_gdpr_data_user_can_richedit');
140
+ function insert_ads_vi_gdpr_data_user_can_richedit($default) {
141
+ if(get_post_type() === 'viconsent') {
142
+ return false;
143
+ }
144
+ return $default;
145
+ }
146
+ /* End Data Storage */
147
+ ?>
includes/vi-integration.php CHANGED
@@ -721,6 +721,12 @@ function insert_ads_vi_customize_adcode_form_get_content() {
721
  $control->HTML .= '</div>';
722
  $control->create_section(' vi Stories Settings ');
723
  echo $control->HTML;
 
 
 
 
 
 
724
  echo '<script type="text/javascript">';
725
  echo $control->JS;
726
  echo 'insert_ads_vi_code_iab_category_parent_change();';
@@ -744,6 +750,8 @@ function insert_ads_vi_customize_adcode_form_save_action() {
744
  $vicodeSettings['optional_1'] = ((isset($_POST['insert_ads_vi_code_settings_optional_1']))?$_POST['insert_ads_vi_code_settings_optional_1']:'');
745
  $vicodeSettings['optional_2'] = ((isset($_POST['insert_ads_vi_code_settings_optional_2']))?$_POST['insert_ads_vi_code_settings_optional_2']:'');
746
  $vicodeSettings['optional_3'] = ((isset($_POST['insert_ads_vi_code_settings_optional_3']))?$_POST['insert_ads_vi_code_settings_optional_3']:'');
 
 
747
  update_option('insert_ads_vi_code_settings', $vicodeSettings);
748
  $viCodeStatus = insert_ads_vi_api_set_vi_code($vicodeSettings);
749
  if(is_array($viCodeStatus) && (isset($viCodeStatus['status'])) && ($viCodeStatus['status'] == 'error')) {
721
  $control->HTML .= '</div>';
722
  $control->create_section(' vi Stories Settings ');
723
  echo $control->HTML;
724
+ $control->clear_controls();
725
+
726
+ $control->HTML .= '<p>Enable GDPR Compliance confirmation notice on your site for visitors from EU.<br />If you disable this option make sure you are using a data usage authorization system on your website to remain GDPR complaint.</p>';
727
+ $control->add_control(array('type' => 'checkbox-button', 'label' => 'Status : Do not Show GDPR Authorization Popup', 'checkedLabel' => 'Status : Show GDPR Authorization Popup', 'uncheckedLabel' => 'Status : Do not Show GDPR Authorization Popup', 'optionName' => 'show_gdpr_authorization'));
728
+ $control->create_section(' vi stories: GDPR Compliance ');
729
+ echo $control->HTML;
730
  echo '<script type="text/javascript">';
731
  echo $control->JS;
732
  echo 'insert_ads_vi_code_iab_category_parent_change();';
750
  $vicodeSettings['optional_1'] = ((isset($_POST['insert_ads_vi_code_settings_optional_1']))?$_POST['insert_ads_vi_code_settings_optional_1']:'');
751
  $vicodeSettings['optional_2'] = ((isset($_POST['insert_ads_vi_code_settings_optional_2']))?$_POST['insert_ads_vi_code_settings_optional_2']:'');
752
  $vicodeSettings['optional_3'] = ((isset($_POST['insert_ads_vi_code_settings_optional_3']))?$_POST['insert_ads_vi_code_settings_optional_3']:'');
753
+
754
+ $vicodeSettings['show_gdpr_authorization'] = ((isset($_POST['insert_ads_vi_code_settings_show_gdpr_authorization']))?$_POST['insert_ads_vi_code_settings_show_gdpr_authorization']:'');
755
  update_option('insert_ads_vi_code_settings', $vicodeSettings);
756
  $viCodeStatus = insert_ads_vi_api_set_vi_code($vicodeSettings);
757
  if(is_array($viCodeStatus) && (isset($viCodeStatus['status'])) && ($viCodeStatus['status'] == 'error')) {
insert-post-ads.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Plugin Name: Insert Post Ads
4
  * Plugin URI: http://www.insertpostads.com/
5
- * Version: 1.3.1
6
  * Author: InsertPostAds
7
  * Author URI: http://www.insertpostads.com/
8
  * Description: Allows you to insert ads after paragraphs of your post content
@@ -39,7 +39,7 @@ class InsertPostAds {
39
  $this->plugin->name = 'insert-post-ads'; // Plugin Folder
40
  $this->plugin->displayName = 'Post Adverts'; // Plugin Name
41
  $this->plugin->posttype = 'insertpostads';
42
- $this->plugin->version = '1.3';
43
  $this->plugin->folder = plugin_dir_path( __FILE__ );
44
  $this->plugin->url = plugin_dir_url( __FILE__ );
45
  $this->plugin->ads_screen_key = $this->plugin->name . '-ads-display-chosen-once';
@@ -613,6 +613,7 @@ require_once(dirname(__FILE__).'/includes/inpostads.php');
613
  require_once(dirname(__FILE__).'/includes/rules.php');
614
  require_once(dirname(__FILE__).'/includes/common.php');
615
  require_once(dirname(__FILE__).'/includes/geotargeting.php');
 
616
  require_once(dirname(__FILE__).'/adstxt.php');
617
  require_once(dirname(__FILE__).'/includes/adstxt.php');
618
  require_once(dirname(__FILE__).'/controls/controls.php');
2
  /**
3
  * Plugin Name: Insert Post Ads
4
  * Plugin URI: http://www.insertpostads.com/
5
+ * Version: 1.3.2
6
  * Author: InsertPostAds
7
  * Author URI: http://www.insertpostads.com/
8
  * Description: Allows you to insert ads after paragraphs of your post content
39
  $this->plugin->name = 'insert-post-ads'; // Plugin Folder
40
  $this->plugin->displayName = 'Post Adverts'; // Plugin Name
41
  $this->plugin->posttype = 'insertpostads';
42
+ $this->plugin->version = '1.3.2';
43
  $this->plugin->folder = plugin_dir_path( __FILE__ );
44
  $this->plugin->url = plugin_dir_url( __FILE__ );
45
  $this->plugin->ads_screen_key = $this->plugin->name . '-ads-display-chosen-once';
613
  require_once(dirname(__FILE__).'/includes/rules.php');
614
  require_once(dirname(__FILE__).'/includes/common.php');
615
  require_once(dirname(__FILE__).'/includes/geotargeting.php');
616
+ require_once(dirname(__FILE__).'/includes/gdpr.php');
617
  require_once(dirname(__FILE__).'/adstxt.php');
618
  require_once(dirname(__FILE__).'/includes/adstxt.php');
619
  require_once(dirname(__FILE__).'/controls/controls.php');
js/admin.js CHANGED
@@ -917,6 +917,7 @@ function insert_ads_vi_customize_adcode() {
917
  var insert_ads_vi_code_settings_optional_1 = jQuery('#insert_ads_vi_code_settings_optional_1').val();
918
  var insert_ads_vi_code_settings_optional_2 = jQuery('#insert_ads_vi_code_settings_optional_2').val();
919
  var insert_ads_vi_code_settings_optional_3 = jQuery('#insert_ads_vi_code_settings_optional_3').val();
 
920
  jQuery('.ui-dialog-content').html('<div class="insert_ads_ajaxloader"></div>');
921
  jQuery('.insert_ads_ajaxloader').show();
922
  jQuery.post(
@@ -935,6 +936,7 @@ function insert_ads_vi_customize_adcode() {
935
  'insert_ads_vi_code_settings_optional_1': insert_ads_vi_code_settings_optional_1,
936
  'insert_ads_vi_code_settings_optional_2': insert_ads_vi_code_settings_optional_2,
937
  'insert_ads_vi_code_settings_optional_3': insert_ads_vi_code_settings_optional_3,
 
938
  }, function(response) {
939
  if(response.indexOf('###SUCCESS###') !== -1) {
940
  jQuery('.ui-dialog-titlebar').find('button').last().button('enable').click();
@@ -1246,6 +1248,7 @@ jQuery(document).ready(function() {
1246
  var insert_ads_vi_code_settings_optional_1 = jQuery('#insert_ads_vi_code_settings_optional_1').val();
1247
  var insert_ads_vi_code_settings_optional_2 = jQuery('#insert_ads_vi_code_settings_optional_2').val();
1248
  var insert_ads_vi_code_settings_optional_3 = jQuery('#insert_ads_vi_code_settings_optional_3').val();
 
1249
  var curLoc = jQuery('input[name="cur-pos-rad"]:checked').val();
1250
  var disLoc = jQuery('input[name="cur-pos-rad"]').not(':checked').val();
1251
  var curStat = jQuery('#insert_ads_inpostads_above_status').is(':checked') ? true : false;
@@ -1267,6 +1270,7 @@ jQuery(document).ready(function() {
1267
  'insert_ads_vi_code_settings_optional_1': insert_ads_vi_code_settings_optional_1,
1268
  'insert_ads_vi_code_settings_optional_2': insert_ads_vi_code_settings_optional_2,
1269
  'insert_ads_vi_code_settings_optional_3': insert_ads_vi_code_settings_optional_3,
 
1270
  }, function(response) {
1271
  if(/*response.indexOf('###SUCCESS###') !== -1*/true) {
1272
  jQuery('.ui-dialog-titlebar').find('button').last().button('enable').click();
917
  var insert_ads_vi_code_settings_optional_1 = jQuery('#insert_ads_vi_code_settings_optional_1').val();
918
  var insert_ads_vi_code_settings_optional_2 = jQuery('#insert_ads_vi_code_settings_optional_2').val();
919
  var insert_ads_vi_code_settings_optional_3 = jQuery('#insert_ads_vi_code_settings_optional_3').val();
920
+ var insert_ads_vi_code_settings_show_gdpr_authorization = jQuery('#insert_ads_vi_code_settings_show_gdpr_authorization').prop('checked');
921
  jQuery('.ui-dialog-content').html('<div class="insert_ads_ajaxloader"></div>');
922
  jQuery('.insert_ads_ajaxloader').show();
923
  jQuery.post(
936
  'insert_ads_vi_code_settings_optional_1': insert_ads_vi_code_settings_optional_1,
937
  'insert_ads_vi_code_settings_optional_2': insert_ads_vi_code_settings_optional_2,
938
  'insert_ads_vi_code_settings_optional_3': insert_ads_vi_code_settings_optional_3,
939
+ 'insert_ads_vi_code_settings_show_gdpr_authorization': insert_ads_vi_code_settings_show_gdpr_authorization,
940
  }, function(response) {
941
  if(response.indexOf('###SUCCESS###') !== -1) {
942
  jQuery('.ui-dialog-titlebar').find('button').last().button('enable').click();
1248
  var insert_ads_vi_code_settings_optional_1 = jQuery('#insert_ads_vi_code_settings_optional_1').val();
1249
  var insert_ads_vi_code_settings_optional_2 = jQuery('#insert_ads_vi_code_settings_optional_2').val();
1250
  var insert_ads_vi_code_settings_optional_3 = jQuery('#insert_ads_vi_code_settings_optional_3').val();
1251
+ var insert_ads_vi_code_settings_show_gdpr_authorization = jQuery('#insert_ads_vi_code_settings_show_gdpr_authorization').prop('checked');
1252
  var curLoc = jQuery('input[name="cur-pos-rad"]:checked').val();
1253
  var disLoc = jQuery('input[name="cur-pos-rad"]').not(':checked').val();
1254
  var curStat = jQuery('#insert_ads_inpostads_above_status').is(':checked') ? true : false;
1270
  'insert_ads_vi_code_settings_optional_1': insert_ads_vi_code_settings_optional_1,
1271
  'insert_ads_vi_code_settings_optional_2': insert_ads_vi_code_settings_optional_2,
1272
  'insert_ads_vi_code_settings_optional_3': insert_ads_vi_code_settings_optional_3,
1273
+ 'insert_ads_vi_code_settings_show_gdpr_authorization': insert_ads_vi_code_settings_show_gdpr_authorization,
1274
  }, function(response) {
1275
  if(/*response.indexOf('###SUCCESS###') !== -1*/true) {
1276
  jQuery('.ui-dialog-titlebar').find('button').last().button('enable').click();
js/gdpr.js ADDED
@@ -0,0 +1,197 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Begin IAB API V 1.1 Implementation */
2
+ var __vicmp = (function () {
3
+ return typeof (__vicmp) == "function" ? __vicmp : function (c) {
4
+ var b = arguments;
5
+ if (!b.length) {
6
+ return __vicmp.a;
7
+ }
8
+ else if (c == '__vicmp') {
9
+ return false;
10
+ } else {
11
+ if (typeof __vicmp.a === 'undefined') {
12
+ __vicmp.a = [];
13
+ }
14
+ __vicmp.a.push([].slice.apply(b));
15
+ if(typeof __vicmp.execute != 'undefined') {
16
+ __vicmp.execute(b);
17
+ }
18
+ }
19
+ }
20
+ })();
21
+
22
+ function insert_ads_vi_consent_onload_cmp() {
23
+ if(typeof __vicmp.execute === 'undefined') {
24
+ __vicmp.execute = function(b) {
25
+ var data = {};
26
+ if(typeof b != 'undefined') {
27
+ if(b[0] == 'getUserConsentStatus') {
28
+ var ViconsentCookie = insert_ads_vi_consent_popup_get_cookie('Viconsent');
29
+ var gdprStatus = false;
30
+ if(document.getElementById('insert_ads_vi_consent_popup_is_eu').value == '1') {
31
+ gdprStatus = true;
32
+ }
33
+ if(ViconsentCookie != '') {
34
+ var ViconsentCookieData = insert_ads_vi_consent_popup_decode_cookie_content(ViconsentCookie);
35
+ data = {
36
+ gdprApplies: gdprStatus,
37
+ hasGlobalScope: false,
38
+ consent: ViconsentCookieData['PurposeAllowed'][1],
39
+ }
40
+ } else { // Cookie Missing / Corrupted
41
+ data = {
42
+ gdprApplies: gdprStatus,
43
+ hasGlobalScope: false,
44
+ consent: false,
45
+ }
46
+ }
47
+ }
48
+ b[2](data, true);
49
+ }
50
+ };
51
+
52
+ if(__vicmp.a && typeof func === 'undefined') {
53
+ for(var i=0; i<__vicmp.a.length;i++) {
54
+ __vicmp.execute(__vicmp.a[i]);
55
+ }
56
+ }
57
+ }
58
+ }
59
+
60
+ setTimeout(insert_ads_vi_consent_onload_cmp, 500);
61
+ /* End IAB API V 1.1 Implementation */
62
+
63
+ /* Begin Consent Cookie Implementation */
64
+ function insert_ads_vi_consent_popup_disagree() {
65
+ var cookieData = insert_ads_vi_consent_popup_create_cookie_content('000000000000000000000000');
66
+ insert_ads_vi_consent_popup_set_cookie('Viconsent', cookieData);
67
+
68
+ var ajaxFrame = document.createElement('iframe');
69
+ ajaxFrame.src = document.getElementById('insert_ads_vi_consent_popup_url').value + '?insert_ads_vi_consent=' + document.getElementById('insert_ads_vi_consent_popup_auth').value;
70
+ ajaxFrame.style.display = 'none';
71
+ document.getElementById('insert_ads_vi_consent_popup_wrapper').appendChild(ajaxFrame);
72
+ document.getElementById('insert_ads_vi_consent_popup_wrapper').style.display = 'none';
73
+ document.getElementById('insert_ads_vi_consent_popup_overlay').style.display = 'none';
74
+ document.getElementById('insert_ads_vi_consent_popup_settings_button').style.display = 'block';
75
+ }
76
+
77
+ function insert_ads_vi_consent_popup_agree() {
78
+ var insert_ads_vi_consent_popup_vendor_list_purposes = document.getElementById('insert_ads_vi_consent_popup_vendor_list_purposes').value;
79
+ var cookieData = insert_ads_vi_consent_popup_create_cookie_content(insert_ads_vi_consent_popup_vendor_list_purposes);
80
+ insert_ads_vi_consent_popup_set_cookie('Viconsent', cookieData);
81
+
82
+ var ajaxFrame = document.createElement('iframe');
83
+ ajaxFrame.src = document.getElementById('insert_ads_vi_consent_popup_url').value + '?insert_ads_vi_consent=' + document.getElementById('insert_ads_vi_consent_popup_auth').value;
84
+ ajaxFrame.style.display = 'none';
85
+ document.getElementById('insert_ads_vi_consent_popup_wrapper').appendChild(ajaxFrame);
86
+ document.getElementById('insert_ads_vi_consent_popup_wrapper').style.display = 'none';
87
+ document.getElementById('insert_ads_vi_consent_popup_overlay').style.display = 'none';
88
+ document.getElementById('insert_ads_vi_consent_popup_settings_button').style.display = 'block';
89
+ }
90
+
91
+ function insert_ads_vi_consent_popup_create_cookie_content(purposeAllowed) {
92
+ cookieConsentTimeStamp = Math.round((new Date()).getTime()/100);
93
+ var cookieConsent = new Object();
94
+ cookieConsent['Version'] = insert_ads_vi_consent_popup_create_binary_string(1, 6);
95
+ cookieConsent['Created'] = insert_ads_vi_consent_popup_create_binary_string(cookieConsentTimeStamp, 36);
96
+ cookieConsent['LastUpdated'] = insert_ads_vi_consent_popup_create_binary_string(cookieConsentTimeStamp, 36);
97
+ cookieConsent['CMPId'] = insert_ads_vi_consent_popup_create_binary_string(999, 12);
98
+ cookieConsent['CMPVersion'] = insert_ads_vi_consent_popup_create_binary_string(0, 6);
99
+ cookieConsent['ConsentScreen'] = insert_ads_vi_consent_popup_create_binary_string(0, 6);
100
+ cookieConsent['ConsentLanguage'] = insert_ads_vi_consent_popup_create_binary_string(4, 6)+insert_ads_vi_consent_popup_create_binary_string(13, 6);
101
+ var insert_ads_vi_consent_popup_vendor_list_version = parseInt(document.getElementById('insert_ads_vi_consent_popup_vendor_list_version').value);
102
+ cookieConsent['VendorListVersion'] = insert_ads_vi_consent_popup_create_binary_string(insert_ads_vi_consent_popup_vendor_list_version, 12);
103
+ cookieConsent['PurposeAllowed'] = purposeAllowed;
104
+
105
+ return window.btoa(cookieConsent['Version'] + cookieConsent['Created'] + cookieConsent['LastUpdated'] + cookieConsent['CMPId'] + cookieConsent['CMPVersion'] + cookieConsent['ConsentScreen'] + cookieConsent['ConsentLanguage'] + cookieConsent['VendorListVersion'] + cookieConsent['PurposeAllowed']);
106
+ }
107
+
108
+ function insert_ads_vi_consent_popup_decode_cookie_content(cookieData) {
109
+ if(cookieData != '') {
110
+ var binaryCookieData = atob(cookieData);
111
+ var cookieConsent = new Object();
112
+ cookieConsent['Version'] = parseInt(binaryCookieData.substring(0, 6), 2);
113
+ cookieConsent['Created'] = parseInt(binaryCookieData.substring(6, 42), 2);
114
+ cookieConsent['LastUpdated'] = parseInt(binaryCookieData.substring(42, 78), 2);
115
+ cookieConsent['CMPId'] = parseInt(binaryCookieData.substring(78, 90), 2);
116
+ cookieConsent['CMPVersion'] = parseInt(binaryCookieData.substring(90, 96), 2);
117
+ cookieConsent['ConsentScreen'] = parseInt(binaryCookieData.substring(96, 102), 2);
118
+ cookieConsent['ConsentLanguage'] = parseInt(binaryCookieData.substring(102, 108), 2)+''+parseInt(binaryCookieData.substring(106, 114), 2);
119
+ cookieConsent['VendorListVersion'] = parseInt(binaryCookieData.substring(114,126), 2);
120
+ cookieConsent['PurposeAllowed'] = binaryCookieData.substring(126, 150);
121
+
122
+ var purposeConsents = new Object();
123
+ for(var i = 24; i > 0; i--) {
124
+ if(cookieConsent['PurposeAllowed'].substring(i - 1, i) == '1') {
125
+ purposeConsents[(24 - i) + 1] = true;
126
+ } else {
127
+ purposeConsents[(24 - i) + 1] = false;
128
+ }
129
+ }
130
+ cookieConsent['PurposeAllowed'] = purposeConsents;
131
+ return cookieConsent;
132
+ }
133
+ return false;
134
+ }
135
+
136
+ function insert_ads_vi_consent_popup_create_binary_string(dMask, dBitSize) {
137
+ var bMask = "";
138
+ if(dBitSize <= 32) {
139
+ while(dBitSize--) {
140
+ bMask += (dMask >> dBitSize) & 1;
141
+ }
142
+ } else {
143
+ bMask = dMask.toString(2);
144
+ while (bMask.length < dBitSize) {
145
+ bMask = "0" + bMask;
146
+ }
147
+ }
148
+ return bMask;
149
+ }
150
+
151
+ function insert_ads_vi_consent_popup_set_cookie(name, value) {
152
+ var date = new Date();
153
+ date.setTime(date.getTime() + (365*24*60*60*1000));
154
+ document.cookie = name + "=" + value + ";" + "expires=" + date.toUTCString() + ";path=/";
155
+ }
156
+
157
+ function insert_ads_vi_consent_popup_get_cookie(cookieName) {
158
+ var name = cookieName + "=";
159
+ var decodedCookie = decodeURIComponent(document.cookie);
160
+ var ca = decodedCookie.split(';');
161
+ for(var i = 0; i <ca.length; i++) {
162
+ var c = ca[i];
163
+ while (c.charAt(0) == ' ') {
164
+ c = c.substring(1);
165
+ }
166
+ if (c.indexOf(name) == 0) {
167
+ return c.substring(name.length, c.length);
168
+ }
169
+ }
170
+ return "";
171
+ }
172
+
173
+ function insert_ads_vi_consent_popup_settings() {
174
+ document.getElementById('insert_ads_vi_consent_popup_wrapper').style.display = 'block';
175
+ document.getElementById('insert_ads_vi_consent_popup_overlay').style.display = 'block';
176
+ document.getElementById('insert_ads_vi_consent_popup_settings_button').style.display = 'none';
177
+ }
178
+
179
+ function insert_ads_vi_consent_popup_load() {
180
+ if(document.getElementById('insert_ads_vi_consent_popup_is_eu').value == true) {
181
+ if(insert_ads_vi_consent_popup_get_cookie('Viconsent') == false) {
182
+ document.getElementById('insert_ads_vi_consent_popup_wrapper').style.display = 'block';
183
+ document.getElementById('insert_ads_vi_consent_popup_overlay').style.display = 'block';
184
+ document.getElementById('insert_ads_vi_consent_popup_settings_button').style.display = 'none';
185
+ } else {
186
+ document.getElementById('insert_ads_vi_consent_popup_wrapper').style.display = 'none';
187
+ document.getElementById('insert_ads_vi_consent_popup_overlay').style.display = 'none';
188
+ document.getElementById('insert_ads_vi_consent_popup_settings_button').style.display = 'block';
189
+ }
190
+ } else {
191
+ document.getElementById('insert_ads_vi_consent_popup_wrapper').style.display = 'none';
192
+ document.getElementById('insert_ads_vi_consent_popup_overlay').style.display = 'none';
193
+ document.getElementById('insert_ads_vi_consent_popup_settings_button').style.display = 'none';
194
+ }
195
+ }
196
+ setTimeout(insert_ads_vi_consent_popup_load, 500);
197
+ /* End Consent Cookie Implementation */
readme.txt CHANGED
@@ -2,8 +2,8 @@
2
  Contributors: insertpostads
3
  Tags: ad injection, ads, ads plugin, adsense, adsense injection, google adsense, insert ads in post, insert post ads, wordpress ads plugin, advertising plugin, banners plugin, post ads
4
  Requires at least: 3.6
5
- Tested up to: 4.9.4
6
- Stable tag: 1.3.1
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -68,6 +68,10 @@ I feel that we have done that here. I hope you enjoy using Insert Post Ads.
68
  Thank you
69
 
70
  == Changelog ==
 
 
 
 
71
  = 1.3.1 =
72
  * Bug fixes
73
 
@@ -116,3 +120,23 @@ Read the FAQ: https://www.vi.ai/frequently-asked-questions-vi-stories-for-wordpr
116
 
117
  = 1.0 =
118
  * First release
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  Contributors: insertpostads
3
  Tags: ad injection, ads, ads plugin, adsense, adsense injection, google adsense, insert ads in post, insert post ads, wordpress ads plugin, advertising plugin, banners plugin, post ads
4
  Requires at least: 3.6
5
+ Tested up to: 4.9.6
6
+ Stable tag: 1.3.2
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
68
  Thank you
69
 
70
  == Changelog ==
71
+ = 1.3.2 =
72
+ * GDPR consent management module added
73
+ * Updated Privacy policy
74
+
75
  = 1.3.1 =
76
  * Bug fixes
77
 
120
 
121
  = 1.0 =
122
  * First release
123
+
124
+ == Privacy Policy ==
125
+
126
+ Users privacy is very important to us and we make extra effort not to collect data about the users to the maximum extend possible.
127
+ However to provide enhanced functionality we utilize the APIs from different third party services as listed below and the usage of those API are in accordance with their privacy policies.
128
+
129
+ = Geo Targeting =
130
+
131
+ To enable Geo Targeting functionality for Ads we have to send the visitor IP address to a third party service (http://freegeoip.net/ OR https://ipstack.com/) and the usage of thier API is in accordance to their privacy policy located at https://ipstack.com/privacy/.
132
+ This third party API is utilized only when you enable or use Geo Targetting features in the plugin admin.
133
+
134
+ = video intelligence =
135
+
136
+ The plugin provides deep integration with video intelligence to provide enhanced features and for easy integration with their services.
137
+ This third party API and features are utilized only when you enable or use video inteligence related features in the plugin admin and the usage of thier API and features are in accordance to their privacy policy.
138
+
139
+ video intelligence ("vi") as a third party, needs to process the user's technical data such as cookie ID, IP Address, Geo-Location and Device ID to personalize content and advertising and analyse our traffic.
140
+ You can find below a link vi's Legal webpage where there are transparently presented all GDPR relevant information.
141
+ Please access the link to check vi's Privacy Policy, Terms&Conditions pages, Opt Out Mechanism, Vendor and Purposes lists.
142
+ https://www.vi.ai/legals/