getTimestamp(); } return 0; } /** * Get a list of processors * @param array $data * @param string $action * @param WP_REST_Request $request * * @return [] */ public function get_proof_of_consent_data($data, $action, $request){ if ( ! cmplz_user_can_manage() ) { return []; } if ( $action==='get_proof_of_consent_documents' ){ $regions = cmplz_get_regions(false, 'full'); //convert key value array to array of objects with id and label $regions = array_map(function($id, $label){ return (object) array('value'=>$id, 'label'=>$label); }, array_keys($regions), $regions); $regions[]=['value'=>'', 'label'=>__('Select a region', 'complianz-gdpr')]; $documents = $this->get_cookie_snapshot_list(); //convert unix timestamp to date //convert the array key to an 'id' foreach ($documents as $key => $document) { $document['time'] = date_i18n( get_option( 'date_format' ), $document['time'] ); $document['id'] = $key; $documents[$key]=$document; } //strip key from the array $documents = empty($documents) ? [] : array_values($documents); $data = [ 'documents' => $documents, 'regions' => $regions, 'download_url' => cmplz_upload_url('snapshots'), ]; } else if ($action==='delete_proof_of_consent_documents') { $documents = $request->get_param('documents'); foreach ($documents as $document) { $this->delete_snapshot($document['file']); } } else if ($action==='generate_proof_of_consent'){ $this->generate_cookie_policy_snapshot(true); $data = [ 'success' => true, ]; } return $data; } /** * Get list of cookie statement snapshots * @param array $args * * @return array */ public function get_cookie_snapshot_list( $args = array() ): array { if ( ! cmplz_user_can_manage() ) { return []; } $defaults = array( 'number' => 30, 'region' => false, 'offset' => 0, 'order' => 'DESC', 'start_date' => 0, 'end_date' => 9999999999999, ); $args = wp_parse_args( $args, $defaults ); $path = cmplz_upload_dir('snapshots'); $url = cmplz_upload_url('snapshots'); $filelist = array(); $extensions = array( "pdf" ); $index = 0; if ( file_exists( $path ) && $handle = opendir( $path ) ) { while ( false !== ( $file = readdir( $handle ) ) ) { if ( $file !== "." && $file !== ".." ) { $file = $path . $file; $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) ); if ( is_file( $file ) && in_array( $ext, $extensions ) ) { if ( $args['region'] && strpos(basename($file), $args['region'].'-proof-of-consent') === false ) { continue; } //get the region from the file name, e.g. rogier-lankhorst-test-amp-bla-eu-proof-of-consent-1-april-2023.pdf //with a regex, where the regex matches the two character region before '-proof-of-consent' $matches = array(); preg_match('/([a-z]{2})-proof-of-consent/', basename($file), $matches); $region = isset($matches[1]) ? $matches[1] : ''; if ( empty( $args['search'] ) || strpos( $file, $args['search'] ) !== false) { $index++; $parsed_index = sprintf('%02d', $index); if ($args['start_date'] < filemtime( $file ) && filemtime( $file ) < $args['end_date'] ) { $filelist[filemtime($file).$parsed_index]["path"] = $file; $filelist[filemtime($file).$parsed_index]["url"] = trailingslashit($url).basename($file); $filelist[filemtime($file).$parsed_index]["file"] = basename($file); $filelist[filemtime($file).$parsed_index]["time"] = filemtime($file); $filelist[filemtime($file).$parsed_index]["region"] = $region; $filelist[filemtime($file).$parsed_index]["consent"] = cmplz_consenttype_nicename(cmplz_get_consenttype_for_region($region)); } } } } } closedir( $handle ); } if ( $args['order'] === 'DESC' ) { krsort( $filelist ); } else { ksort( $filelist ); } if ( empty( $filelist ) ) { return []; } $page = (int) $args['offset']; $total = count( $filelist ); //total items in array $limit = (int) $args['number']; $totalPages = $limit===-1 ? 1 : ceil( $total / $limit ); //calculate total pages $page = max( $page, 1 ); //get 1 page when $_GET['page'] <= 0 $page = min( $page, $totalPages ); //get last page when $_GET['page'] > $totalPages $offset = ( $page - 1 ) * $limit; if ( $offset < 0 ) { $offset = 0; } if ($limit!=-1) { $filelist = array_slice( $filelist, $offset, $limit, true ); } if ( empty( $filelist ) ) { return []; } return $filelist; } /** * @param string $filename */ public function delete_snapshot( string $filename ): void { if ( ! cmplz_user_can_manage() ) { return; } $path = cmplz_upload_dir('snapshots/'); //don't allow \ and / in the filename, to prevent path traversal, replace them with '' $filename = str_replace( array( '/', '\\' ), '', $filename ); unlink( $path . sanitize_file_name( $filename ) ); } /** * Generate the cookie policy snapshot * @param bool $force */ public function generate_cookie_policy_snapshot( $force = false ) { if ( defined('CMPLZ_SKIP_SNAPSHOT_GENERATION') && CMPLZ_SKIP_SNAPSHOT_GENERATION ) { return; } if ( ! $force && ! get_option( 'cmplz_generate_new_cookiepolicy_snapshot' ) ) { return; } $regions = cmplz_get_regions(); foreach ( $regions as $region ) { $banner_id = cmplz_get_default_banner_id(); $banner = cmplz_get_cookiebanner( $banner_id ); $settings = $banner->get_front_end_settings(); $settings += $banner->get_html_settings(); $settings['privacy_link_us '] = COMPLIANZ::$document->get_page_url( 'privacy-statement', 'us' ); $settings_html = ''; $skip = array( 'categorie', 'use_custom_cookie_css', 'logo', 'custom_css_amp', 'static', 'set_cookies', 'position', 'version', 'banner_version', 'a_b_testing', 'a_b_testing_buttons', 'title', 'privacy_link', 'nonce', 'url', 'current_policy_id', 'type', 'layout', 'use_custom_css', 'custom_css', 'banner_width', 'colorpalette_background', 'colorpalette_text', 'colorpalette_toggles', 'colorpalette_border_radius', 'border_width', 'store_consent', 'cookie_domain', 'set_cookies_on_root', 'placeholdertext', 'css_file', 'page_links', 'tm_categories', 'cookie_path', 'colorpalette_button_accept', 'colorpalette_button_deny', 'colorpalette_button_settings', 'buttons_border_radius', ); $settings['categories'] = isset($settings['categories']) ? implode(', ', $settings['categories']) : ''; unset( $settings["readmore_url"] ); $settings = apply_filters( 'cmplz_cookie_policy_snapshot_settings' ,$settings ); foreach ( $settings as $key => $value ) { if ( in_array( $key, $skip ) ) { continue; } if (is_array($value)) $value = implode(',', $value); $settings_html .= '
  • ' . $key . ' => ' . esc_html( $value ) . '
  • '; } $settings_html = '

    ' . __( 'Cookie consent settings', 'complianz-gdpr' ) . '

    '; $intro = '

    ' . __( "Proof of Consent", "complianz-gdpr" ) . '

    ' . cmplz_sprintf( __( "This document was generated to show efforts made to comply with privacy legislation. This document will contain the Cookie Policy and the cookie consent settings to proof consent for the time and region specified below. For more information about this document, please go to %shttps://complianz.io/consent%s.", "complianz-gdpr" ), '', "" ) . '

    '; COMPLIANZ::$document->generate_pdf( 'cookie-statement', $region, false, true, $intro, $settings_html ); do_action('cmplz_after_proof_of_consent_generation', get_option( 'cmplz_generate_new_cookiepolicy_snapshot') ); } update_option( 'cmplz_generate_new_cookiepolicy_snapshot', false, false ); } } } //class closure