%PDF- %PDF-
Direktori : /home/t/r/a/tradesc/www/relax/wp-content/plugins/complianz-gdpr/cookie/ |
Current File : /home/t/r/a/tradesc/www/relax/wp-content/plugins/complianz-gdpr/cookie/class-service.php |
<?php defined( 'ABSPATH' ) or die( "you do not have access to this page!" ); if ( ! class_exists( "CMPLZ_SERVICE" ) ) { /** * All properties are public, because otherwise the empty check on a property fails, and requires an intermediate variable assignment. * https://stackoverflow.com/questions/16918973/php-emptystring-return-true-but-string-is-not-empty */ class CMPLZ_SERVICE { public $ID = false; public $name; public $serviceType; public $category; public $sharesData; public $thirdParty; public $secondParty; //service that share data, but have cookies on the sites domain public $sync; public $synced; public $privacyStatementURL; public $isTranslationFrom; public $lastUpdatedDate; public $language; public $languages; public $complete; public $slug; function __construct( $ID = false, $language = 'en' ) { $this->language = cmplz_sanitize_language( $language ); if ( $ID ) { if ( is_numeric( $ID ) ) { $this->ID = intval( $ID ); } else { $this->name = $this->sanitize_service( $ID ); } } if ( $this->name !== false || $this->ID !== false ) { //initialize the cookie with this id. $this->get(); } } public function __get( $property ) { if ( property_exists( $this, $property ) ) { return $this->$property; } } public function __set( $property, $value ) { if ( property_exists( $this, $property ) ) { $this->$property = $value; } return $this; } /** * retrieve list of cookies with this service * * @return array() $cookies */ public function get_cookies() { if ( ! $this->ID ) { return array(); } global $wpdb; $cookies = wp_cache_get('cmplz_service_cookies_'.$this->ID, 'complianz'); if ( !$cookies ) { $cookies = $wpdb->get_results( $wpdb->prepare( "select * from {$wpdb->prefix}cmplz_cookies where serviceID = %s ", $this->ID ) ); wp_cache_set('cmplz_service_cookies_'.$this->ID, $cookies, 'complianz', HOUR_IN_SECONDS); } return $cookies; } /** * Retrieve the service data from the table * * @param $parent //if it should be the parent itme */ private function get( $parent = false ) { global $wpdb; if ( ! $this->name && ! $this->ID ) { return; } $sql = ''; if ( $parent ) { $sql = " AND isTranslationFrom = FALSE"; } if ( $this->ID ) { $service = wp_cache_get('cmplz_service_'.$this->ID, 'complianz'); if ( !$service ) { $service = $wpdb->get_row( $wpdb->prepare( "select * from {$wpdb->prefix}cmplz_services where ID = %s ", $this->ID ) ); wp_cache_set('cmplz_service_'.$this->ID, $service, 'complianz', HOUR_IN_SECONDS); } } else { $service = $wpdb->get_row( $wpdb->prepare( "select * from {$wpdb->prefix}cmplz_services where name = %s and language = %s " . $sql, $this->name, $this->language ) ); } if ( $service ) { $this->ID = $service->ID; $this->name = $service->name; $this->serviceType = html_entity_decode($service->serviceType); $this->sharesData = $service->thirdParty; //legacy, sharesData was first called thirdparty $this->secondParty = $service->secondParty; $this->thirdParty = $this->sharesData && ! $service->secondParty; $this->sync = $service->sync; $this->privacyStatementURL = $service->privacyStatementURL; $this->language = $service->language; $this->category = $service->category; $this->isTranslationFrom = $service->isTranslationFrom; $this->lastUpdatedDate = $service->lastUpdatedDate; $this->synced = $this->sync && $service->lastUpdatedDate > 0 ? true : false; $this->slug = $service->slug; $this->complete = ! ( empty( $this->name ) || ( empty( $this->privacyStatementURL ) && $this->sharesData ) || empty( $this->serviceType ) || empty( $this->name ) ); } } /** * Saves the data for a given service, ore creates a new one if no ID was passed. * @param bool $updateAllLanguages * @param bool $forceWizardUpdate */ public function save( $updateAllLanguages = false, $forceWizardUpdate = true) { if ( !cmplz_user_can_manage() ) { return; } if ( empty( $this->name ) ) { return; } if ($forceWizardUpdate) { $this->add_to_wizard( $this->name ); } if ( $this->language === 'en' ) { cmplz_register_translation( $this->serviceType, 'service_type' ); } $update_array = array( 'name' => sanitize_text_field( $this->name ), 'thirdParty' => (bool) $this->sharesData, //legacy, sharesData was first called third party. 'sharesData' => (bool) $this->sharesData, //fluid upgrade 'secondParty' => (bool) $this->secondParty, 'sync' => (bool) $this->sync, 'serviceType' => sanitize_text_field( $this->serviceType ), 'privacyStatementURL' => sanitize_text_field( $this->privacyStatementURL ), 'language' => cmplz_sanitize_language( $this->language ), 'category' => sanitize_text_field( $this->category ), 'isTranslationFrom' => sanitize_text_field( $this->isTranslationFrom ), 'lastUpdatedDate' => (int) $this->lastUpdatedDate, 'slug' => empty($this->slug) ? '' : sanitize_title( $this->slug ), ); global $wpdb; //if we have an ID, we update the existing value if ( $this->ID ) { $wpdb->update( $wpdb->prefix . 'cmplz_services', $update_array, array( 'ID' => $this->ID ) ); } else { $wpdb->insert( $wpdb->prefix . 'cmplz_services', $update_array ); $this->ID = $wpdb->insert_id; } if ( $updateAllLanguages ) { //keep all translations in sync $translationIDS = $this->get_translations(); foreach ( $translationIDS as $translationID ) { if ( $this->ID == $translationID ) { continue; } $translation = new CMPLZ_SERVICE( $translationID ); $translation->name = $this->name; $translation->sync = $this->sync; $translation->serviceType = $this->serviceType; $translation->sharesData = $this->sharesData; $translation->showOnPolicy = $this->showOnPolicy; $translation->lastUpdatedDate = $this->lastUpdatedDate; $translation->save(false, false); } } cmplz_delete_transient('cmplz_cookie_shredder_list'); wp_cache_delete('cmplz_service_cookies_'.$this->ID, 'complianz'); wp_cache_delete('cmplz_service_'.$this->ID, 'complianz'); } /** * Delete this service, and all translations linked to it. */ public function delete() { if ( !cmplz_user_can_manage() ) { return; } if ( ! $this->ID ) { return; } //get all related cookies, and delete them. $cookies = $this->get_cookies(); foreach ( $cookies as $service_cookie ) { $cookie = new CMPLZ_COOKIE( $service_cookie->ID ); $cookie->delete(true); } $this->drop_from_wizard( $this->name ); $translations = $this->get_translations(); global $wpdb; foreach ( $translations as $ID ) { $wpdb->delete( $wpdb->prefix . 'cmplz_services', array( 'ID' => $ID ) ); } } /** * Keep services in sync with the services in the list of the wizard. * * @param $service */ private function drop_from_wizard( $service ) { if ( !cmplz_user_can_manage() ) { return; } $slug = $this->get_service_slug( $service ); $services = cmplz_get_option( 'thirdparty_services_on_site' ); if (!is_array($services)) $services = array(); if ( in_array($slug, $services, true ) ) { $index = array_search($slug, $services, true); unset($services[$index]); cmplz_update_option_no_hooks('thirdparty_services_on_site', $services); } $social = cmplz_get_option( 'socialmedia_on_site' ); if (!is_array($social)) $social = array(); if ( in_array($slug, $social, true ) ) { $index = array_search($slug, $social, true); unset($social[$index]); cmplz_update_option_no_hooks('socialmedia_on_site', $social); } } /** * Keep services in sync with the services in the list of the wizard. * * @param $service */ private function add_to_wizard( $service ) { if ( !cmplz_user_can_manage() ) { return; } $slug = $this->get_service_slug( $service ); $registered_services = COMPLIANZ::$config->thirdparty_services; $services = cmplz_get_option('thirdparty_services_on_site'); if ( !is_array($services) ) $services = array(); if ( isset( $registered_services[ $slug ] ) && !in_array($slug, $services, true ) ) { $services[] = $slug; cmplz_update_option_no_hooks( 'thirdparty_services_on_site', $services ); } $registered_social = COMPLIANZ::$config->thirdparty_socialmedia; $social = cmplz_get_option('socialmedia_on_site'); if ( !is_array($social) ) $social = array(); if ( isset( $registered_social[ $slug ] ) && !in_array($slug, $social, true ) ) { $social[] = $slug; cmplz_update_option_no_hooks( 'socialmedia_on_site', $social ); } } /** * Get slug from service * * @param $name * * @return bool|false|int|string */ private function get_service_slug( $name ) { $services = COMPLIANZ::$config->thirdparty_services; if ( ( $slug = array_search( $name, $services ) ) !== false ) { return $slug; } $social = COMPLIANZ::$config->thirdparty_socialmedia; if ( ( $slug = array_search( $name, $social ) ) !== false ) { return $slug; } return false; } public function get_translations() { global $wpdb; //check if this cookie is a parent if ( ! $this->isTranslationFrom ) { //is parent. Get all cookies where translationfrom = this id $parent_id = $this->ID; } else { //not parent. $parent_id = $this->isTranslationFrom; } $sql = $wpdb->prepare( "select * from {$wpdb->prefix}cmplz_services where isTranslationFrom = %s", $parent_id ); $results = $wpdb->get_results( $sql ); $translations = wp_list_pluck( $results, 'ID' ); //add the parent id $translations[] = $parent_id; return $translations; } /** * Add service to the database * * @param $name * @param array $languages * @param string $return_language * @param string $categoryc * @param bool $sync_on * * @return bool|int */ public function add( $name, $languages = array( 'en' ), $return_language = 'en', $category = '', $sync_on = true ) { if ( !cmplz_user_can_manage() ) { return false; } $return_id = false; //insert for each language $this->languages = cmplz_sanitize_languages( $languages ); $this->name = $name; //check if there is a parent cookie for this name $this->get( true ); //if no ID is found, insert in the database if ( ! $this->ID ) { $this->sync = $sync_on; $this->category = $category; $this->save(false, false ); } $parent_ID = $this->ID; if ( $return_language === 'en' ) { $return_id = $this->ID; } //make sure each language is available foreach ( $this->languages as $language ) { if ( $language === 'en' ) { continue; } $translated_service = new CMPLZ_SERVICE( $name, $language ); if ( ! $translated_service->ID ) { $translated_service->sync = $sync_on; } $translated_service->category = $category; $translated_service->isTranslationFrom = $parent_ID; $translated_service->save(false, false); if ( $return_language && $language == $return_language ) { $return_id = $translated_service->ID; } } return $return_id; } /** * Validate a service string * * @param $service * * @return string|bool */ private function sanitize_service( $service ) { return sanitize_text_field( $service ); } } }